【问题标题】:How can I correct the following SQL script?如何更正以下 SQL 脚本?
【发布时间】:2021-12-27 00:22:20
【问题描述】:

我被分配根据我一周前研究并重新创建的 ERD 在 SQL 中创建一个数据库。我正在使用这个名为“Oracle SQL Developer”的应用程序,并尝试了解如何创建表、主键、外键、序列、视图等。我在开发人员身上测试了我的草稿,他们不断出现以下错误: [在此处输入图片说明][1]

[1]:https://i.stack.imgur.com/vk0cu.png这是由于部分识别规则导致的一些语法错误。

其他错误包括缺少右括号、具有多个主键的表等。到目前为止,这是我在启动数据库方面的最大努力:

/* CREATE A TABLE FOR CUSTOMER INFORMATION FROM THE GREETING CARD CUSTOMIZATION APPLICATION */
CREATE TABLE CUSTOMER
(CUST_EMAIL VARCHAR(10) PRIMARY KEY,
CUST_NAME VARCHAR(10) NOT NULL,
CUST_PHONE NUMERIC(10) NOT NULL,
CUST_ADDRESS VARCHAR(10) NOT NULL,
CUST_CITY VARCHAR(10) NOT NULL,
CUST_STATE VARCHAR(10) NOT NULL,
CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUST_EMAIL)
);
/* CREATE A TABLE FOR GREETING CARD AND ENVELOPE ORDER INFORMATION */
CREATE TABLE PRODUCTS
(ORDER_NO NUMERIC(10) PRIMARY KEY,
CUST_EMAIL VARCHAR(10) FOREIGN KEY,
TRACK_ID NUMERIC(10) NOT NULL,
CONF_NO NUMERIC(10) NOT NULL,
ORDER_DATE DATE(10) NOT NULL,
SHIP_DATE DATE(10) NOT NULL,
CONSTRAINT PK_PRODUCTS PRIMARY KEY (ORDER_NO)
CONSTRAINT FK_PRODUCTS_CUST_EMAIL FOREIGN KEY (CUST_EMAIL) REFERENCES CUSTOMER);
/* CREATE A TABLE FOR PAYMENT INFORMATION */
CREATE TABLE PAYMENT
(PAY_ID NUMERIC(10) PRIMARY KEY,
ORDER_NO NUMERIC(10) FOREIGN KEY,
CARD_TYPE VARCHAR(10) NOT NULL,
PRICE NUMERIC(10) NOT NULL,
PAY_DATE DATE(10) NOT NULL,
PAY_CONF INTEGER(10) NOT NULL,
CONSTRAINT PK_PAYMENT PRIMARY KEY (PAY_ID),
CONSTRAINT FK_PAYMENT_ORDER_NO FOREIGN KEY (ORDER_NO) REFERENCES PRODUCTS);
/* CREATE A TABLE FOR PRODUCT DELIVERY INFORMATION */
CREATE TABLE DELIVERY
(DEL_ID NUMERIC(10) PRIMARY KEY,
ORDER_NO NUMERIC(10) FOREIGN KEY,
SHIP_DATE DATE(10) FOREIGN KEY,
DEL_DATE DATE(10) NOT NULL,
STATUS VARCHAR(10) NOT NULL,
DEL_MODE VARCHAR(10) NOT NULL,
INVOICE_NO INTEGER(10) NOT NULL,
CONSTRAINT PK_DELIVERY PRIMARY KEY (DEL_ID),
CONSTRAINT FK_DELIVERY_ORDER_NO FOREIGN KEY (ORDER_NO) REFERENCES PRODUCTS
CONSTRAINT FK_DELIVERY_SHIP_DATE FOREIGN KEY (SHIP_DATE) REFERENCES PRODUCTS);
/* CREATE A TABLE FOR RECIPIENT INFORMATION */
CREATE TABLE RECIPIENT
(STREET_ADDRESS VARCHAR(10) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
CITY VARCHAR(10) NOT NULL,
STATE VARCHAR(10) NOT NULL,
ZIP INTEGER(10) NOT NULL,
CONSTRAINT PK_RECIPIENT PRIMARY KEY (STREET_ADDRESS)
);

如果应用正确地说我遗漏了一些括号,我应该把括号放在哪里?我什至在哪里有多个主键,我如何改写我的行以减少它们?如何将我的规则从部分认可变为完全认可?

这是针对关系数据库系统的大学项目。我只需要创建一些表、主键和外键,以便允许我创建序列。

【问题讨论】:

  • FOREIGN KEY 本身什么也没说,您需要以TABLE (ATTRIBUTE) 的方式添加该外键的引用。至少对我来说,在互联网上搜索正确的外键语法比创建一个 so 问题更容易......w3schools.com/sql/sql_foreignkey.asp
  • 我认为键是在所有列之后声明的。一些来源:link 1link 2link3
  • 去掉FOREIGN KEY这个词,你已经在创建表脚本的末尾定义了约束,Create table foreign key
  • 如果您在 SQL Developer(数据建模器)中构建您的 ERD,它将为您生成开箱即用的有效 DDL。您知道您可以在 SQL Developer 中创建模型/图表吗?
  • 如何修复无效标识符和缺少括号?

标签: sql oracle-sqldeveloper entity-relationship


【解决方案1】:
  • DATEINTEGER 没有精度。
  • 声明 PRIMARY KEY 内联或外联,但不能同时声明。
  • 外键也是如此(内联外键需要 REFERENCES 关键字,而不是 FOREIGN KEY 关键字)。
  • VARCHAR 会更好VARCHAR2
  • FOREIGN KEY 不能引用非主键、非唯一列(即 SHIP_DATE)。虽然您可以在 ORDER_NOSHIP_DATE 上创建一个 UNIQUE 复合键并引用它(下面的示例);从DELIVERY 表中完全删除SHIP_DATE 可能会更好(然后您不需要外键)并将其保存在一个表中,以便表处于第三范式。如果您希望信息显示,则使用ORDER_NO 外键JOIN 表。
/* CREATE A TABLE FOR CUSTOMER INFORMATION FROM THE GREETING CARD CUSTOMIZATION APPLICATION */
CREATE TABLE CUSTOMER(
  CUST_EMAIL   VARCHAR2(10),
  CUST_NAME    VARCHAR2(10) NOT NULL,
  CUST_PHONE   NUMERIC(10) NOT NULL,
  CUST_ADDRESS VARCHAR2(10) NOT NULL,
  CUST_CITY    VARCHAR2(10) NOT NULL,
  CUST_STATE   VARCHAR2(10) NOT NULL,
  CONSTRAINT PK_CUSTOMER PRIMARY KEY (CUST_EMAIL)
);

/* CREATE A TABLE FOR GREETING CARD AND ENVELOPE ORDER INFORMATION */
CREATE TABLE PRODUCTS(
  ORDER_NO   NUMERIC(10),
  CUST_EMAIL VARCHAR2(10),
  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 U_PRODUCTS UNIQUE (ORDER_NO, SHIP_DATE),
  CONSTRAINT FK_PRODUCTS_CUST_EMAIL FOREIGN KEY (CUST_EMAIL) REFERENCES CUSTOMER
);

/* CREATE A TABLE FOR PAYMENT INFORMATION */
CREATE TABLE PAYMENT(
  PAY_ID    NUMERIC(10),
  ORDER_NO  NUMERIC(10),
  CARD_TYPE VARCHAR2(10) NOT NULL,
  PRICE     NUMERIC(10) 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
);

/* CREATE A TABLE FOR PRODUCT DELIVERY INFORMATION */
CREATE TABLE DELIVERY(
  DEL_ID     NUMERIC(10),
  ORDER_NO   NUMERIC(10),
  SHIP_DATE  DATE,                   -- Delete this line
  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,
  CONSTRAINT FK_DELIVERY_SHIP_DATE FOREIGN KEY (ORDER_NO, SHIP_DATE) REFERENCES PRODUCTS (ORDER_NO, SHIP_DATE) -- Delete this line.
);

/* CREATE A TABLE FOR RECIPIENT INFORMATION */
CREATE TABLE RECIPIENT(
  STREET_ADDRESS VARCHAR2(10),
  NAME           VARCHAR2(10) NOT NULL,
  CITY           VARCHAR2(10) NOT NULL,
  STATE          VARCHAR2(10) NOT NULL,
  ZIP            INTEGER NOT NULL,
  CONSTRAINT PK_RECIPIENT PRIMARY KEY (STREET_ADDRESS)
);

db小提琴here

【讨论】:

  • 感谢您的这些建议。但是,对于涉及 PRODUCTS 表中缺少右括号以及涉及 PAYMENT 或 DELIVERY 表中不存在的视图的错误,我仍然需要帮助。
  • 我也遇到了 DELIVERY 表中一些无效标识符的问题,但我不知道它是什么。
  • @GGomes4 dbfiddle 中的代码有效。我不确定你做了什么不同的事情,但你需要弄清楚你所做的改变并修复它。
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多