You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:45:08