如何修正Oracle SQL建表脚本的重复主键、缺括号等语法错误
Oracle SQL建表脚本错误修正方案
错误总览
你脚本中的报错均为基础语法错误,所有问题可对应修正如下:
1. 单表多主键问题修正
所有5张表都存在重复定义主键的问题:你在列定义时添加了PRIMARY KEY声明,后续又通过CONSTRAINT二次定义了主键,单表仅允许存在一个主键。
修正方式:删除所有列定义后的PRIMARY KEY关键字,保留命名的表级主键约束即可,便于后续维护。
2. 缺少右括号问题修正
该报错为语法错误触发的误判,并非真的缺少右括号,触发原因如下:
- 多个表级约束之间未添加逗号分隔(例如PRODUCTS表的主键约束后直接写外键约束,缺少逗号)
DATE、INTEGER类型不允许指定长度,你写的DATE(10)、INTEGER(10)属于非法语法- 列定义时非法添加
FOREIGN KEY关键字,外键不能在列级直接声明
修正上述问题后,缺少右括号报错会自动消失。
3. 约束无法识别问题修正
- 外键约束统一放在表级通过
CONSTRAINT声明,不要写在列定义后 - 外键的
REFERENCES子句必须指定父表的关联列,例如REFERENCES CUSTOMER(CUST_EMAIL),不能只写父表名 - 删除
DATE、INTEGER类型后的长度参数 - 多个约束之间必须用逗号分隔
另外你脚本中DELIVERY表的SHIP_DATE外键引用不合法:PRODUCTS表的SHIP_DATE不是主键/唯一键,无法作为外键被引用,建议删除该外键约束,仅通过ORDER_NO关联两个表即可。
4. 修正后的完整脚本
/* 客户信息表 */ CREATE TABLE CUSTOMER ( CUST_EMAIL VARCHAR2(50) NOT NULL, CUST_NAME VARCHAR2(20) NOT NULL, CUST_PHONE NUMERIC(11) NOT NULL, CUST_ADDRESS VARCHAR2(100) NOT NULL, CUST_CITY VARCHAR2(20) NOT NULL, CUST_STATE VARCHAR2(20) NOT NULL, CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUST_EMAIL) ); /* 订单产品表 */ CREATE TABLE PRODUCTS ( ORDER_NO NUMERIC(10) NOT NULL, CUST_EMAIL VARCHAR2(50) NOT NULL, TRACK_ID NUMERIC(10) NOT NULL, CONF_NO NUMERIC(10) NOT NULL, ORDER_DATE DATE NOT NULL, SHIP_DATE DATE NOT NULL, CONSTRAINT PK_PRODUCTS PRIMARY KEY (ORDER_NO), CONSTRAINT FK_PRODUCTS_CUST_EMAIL FOREIGN KEY (CUST_EMAIL) REFERENCES CUSTOMER(CUST_EMAIL) ); /* 支付信息表 */ CREATE TABLE PAYMENT ( PAY_ID NUMERIC(10) NOT NULL, ORDER_NO NUMERIC(10) NOT NULL, CARD_TYPE VARCHAR2(10) NOT NULL, PRICE NUMERIC(10,2) NOT NULL, PAY_DATE DATE NOT NULL, PAY_CONF INTEGER NOT NULL, CONSTRAINT PK_PAYMENT PRIMARY KEY (PAY_ID), CONSTRAINT FK_PAYMENT_ORDER_NO FOREIGN KEY (ORDER_NO) REFERENCES PRODUCTS(ORDER_NO) ); /* 配送信息表 */ CREATE TABLE DELIVERY ( DEL_ID NUMERIC(10) NOT NULL, ORDER_NO NUMERIC(10) NOT NULL, SHIP_DATE DATE NOT NULL, DEL_DATE DATE NOT NULL, STATUS VARCHAR2(10) NOT NULL, DEL_MODE VARCHAR2(10) NOT NULL, INVOICE_NO INTEGER NOT NULL, CONSTRAINT PK_DELIVERY PRIMARY KEY (DEL_ID), CONSTRAINT FK_DELIVERY_ORDER_NO FOREIGN KEY (ORDER_NO) REFERENCES PRODUCTS(ORDER_NO) ); /* 收件人信息表 */ CREATE TABLE RECIPIENT ( STREET_ADDRESS VARCHAR2(100) NOT NULL, NAME VARCHAR2(20) NOT NULL, CITY VARCHAR2(20) NOT NULL, STATE VARCHAR2(20) NOT NULL, ZIP INTEGER NOT NULL, CONSTRAINT PK_RECIPIENT PRIMARY KEY (STREET_ADDRESS) );
注意:脚本中调整了字段长度,原脚本中邮箱、地址等字段仅设置10位长度完全无法满足实际使用,你可以根据课程要求调整回原长度;价格字段添加了两位小数位更符合业务逻辑,不需要可改回
NUMERIC(10);收件人表使用地址作为主键不符合实际业务逻辑,若ERD无特殊要求建议增加独立的收件人ID作为主键。
内容的提问来源于stack exchange,提问作者GGomes4
相关产品推荐
相关产品推荐

