规范化后创建 table 时出现问题
Problems creating table after normalisation
我的任务是规范化销售订单、创建关系模式并将数据输入 SQL 开发人员。
我已经标准化为 3NF 并得到了这个:
Customer(Customer_ID, Customer_name) ... Primary key = Customer_ID
Employee(Employee_ID, Employee_name) ... Primary key = Employee_ID
Sales_Order(Sales_order_ID, Employee_ID, Customer_ID, Sale_date, Order_total) ... Primary key = Sales_order_ID ... Foreign keys = Employee_ID, Customer_ID
Order_Line(Sales_order_ID, Product_ID, Quantity, Line_total) ... Composite key = Sales_order_ID ... Foreign key = Product_ID
Product(Product_ID, Product_name, Product_price, Product_colour) ... Primary key = Product_ID
然后我输入了tables,这是我的SQL:
CREATE TABLE EMPLOYEE(
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_name)
);
CREATE TABLE CUSTOMER(
Customer_ID CHAR(5),
Customer_Name CHAR(20),
CONSTRAINT pk_Customer PRIMARY KEY (Customer_ID)
);
CREATE TABLE PRODUCT(
Product_ID CHAR(5),
Product_Name CHAR(30),
Product_Colour CHAR(10),
Product_Price CHAR(5),
CONSTRAINT pk_Product PRIMARY KEY (Product_ID)
);
CREATE TABLE SALES_ORDER(
Sales_order_ID CHAR(6),
Employee_ID CHAR(3),
Customer_ID CHAR(5),
Sale_Date CHAR(10),
Order_total CHAR(7),
CONSTRAINT pk_Order PRIMARY KEY (Sales_order_ID),
CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),
FOREIGN KEY (Customer_ID) REFERENCES CUSTOMER (Customer_ID)
);
CREATE TABLE ORDER_LINE(
Sales_order_ID CHAR(6),
Product_ID CHAR(5),
Quantity CHAR(3),
Line_total CHAR(5),
CONSTRAINT pk_Order_Line PRIMARY KEY (Sales_order_ID),
FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID)
);
我可以输入 tables Employee
, Customer
, Product
, Sales_order
但无法输入 Order_line
我被告知 table 或视图不存在!
这是什么意思?
我是否规范化不正确?
我是否错误地设计了关系模式?
任何帮助将不胜感激
当我 运行 您在 this db fiddle 中的代码时,创建 table SALE_ORDER
失败并显示以下消息:
ORA-02270: no matching unique or primary key for this column-list
这是因为这个外键:
CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),
潜在的问题是您将 Employee_name
定义为 table EMPLOYEE
的主键。
CREATE TABLE EMPLOYEE (
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);
这似乎不是一个明智的选择。在现实生活中,两个不同的员工可能有相同的名字。相反,您可能想使用 Employee_ID
作为 EMPLOYEE
.
的主键
考虑 table EMPLOYEE
的定义:
CREATE TABLE EMPLOYEE (
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);
使用这个新设置,所有 table 都已成功创建。您现在可以插入数据了。
旁注:我预见到 table ORDER_LINE
的问题:
主键应该是Order_line_ID
而不是Sales_order_ID
Sales_order_ID
应该有一个引用 SALE_ORDER(Sales_order_ID)
的外键约束。
考虑 ORDER_LINE
的新定义:
CREATE TABLE ORDER_LINE(
Order_line_ID CHAR(6),
Sales_order_ID CHAR(6),
Product_ID CHAR(5),
Quantity CHAR(3),
Line_total CHAR(5),
CONSTRAINT pk_Order_Line PRIMARY KEY (Order_line_ID),
FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID),
FOREIGN KEY (Sales_order_ID) REFERENCES SALES_ORDER(Sales_order_ID)
);
我的任务是规范化销售订单、创建关系模式并将数据输入 SQL 开发人员。
我已经标准化为 3NF 并得到了这个:
Customer(Customer_ID, Customer_name) ... Primary key = Customer_ID
Employee(Employee_ID, Employee_name) ... Primary key = Employee_ID
Sales_Order(Sales_order_ID, Employee_ID, Customer_ID, Sale_date, Order_total) ... Primary key = Sales_order_ID ... Foreign keys = Employee_ID, Customer_ID
Order_Line(Sales_order_ID, Product_ID, Quantity, Line_total) ... Composite key = Sales_order_ID ... Foreign key = Product_ID
Product(Product_ID, Product_name, Product_price, Product_colour) ... Primary key = Product_ID
然后我输入了tables,这是我的SQL:
CREATE TABLE EMPLOYEE(
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_name)
);
CREATE TABLE CUSTOMER(
Customer_ID CHAR(5),
Customer_Name CHAR(20),
CONSTRAINT pk_Customer PRIMARY KEY (Customer_ID)
);
CREATE TABLE PRODUCT(
Product_ID CHAR(5),
Product_Name CHAR(30),
Product_Colour CHAR(10),
Product_Price CHAR(5),
CONSTRAINT pk_Product PRIMARY KEY (Product_ID)
);
CREATE TABLE SALES_ORDER(
Sales_order_ID CHAR(6),
Employee_ID CHAR(3),
Customer_ID CHAR(5),
Sale_Date CHAR(10),
Order_total CHAR(7),
CONSTRAINT pk_Order PRIMARY KEY (Sales_order_ID),
CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),
FOREIGN KEY (Customer_ID) REFERENCES CUSTOMER (Customer_ID)
);
CREATE TABLE ORDER_LINE(
Sales_order_ID CHAR(6),
Product_ID CHAR(5),
Quantity CHAR(3),
Line_total CHAR(5),
CONSTRAINT pk_Order_Line PRIMARY KEY (Sales_order_ID),
FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID)
);
我可以输入 tables Employee
, Customer
, Product
, Sales_order
但无法输入 Order_line
我被告知 table 或视图不存在!
这是什么意思?
我是否规范化不正确?
我是否错误地设计了关系模式?
任何帮助将不胜感激
当我 运行 您在 this db fiddle 中的代码时,创建 table SALE_ORDER
失败并显示以下消息:
ORA-02270: no matching unique or primary key for this column-list
这是因为这个外键:
CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),
潜在的问题是您将 Employee_name
定义为 table EMPLOYEE
的主键。
CREATE TABLE EMPLOYEE (
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);
这似乎不是一个明智的选择。在现实生活中,两个不同的员工可能有相同的名字。相反,您可能想使用 Employee_ID
作为 EMPLOYEE
.
考虑 table EMPLOYEE
的定义:
CREATE TABLE EMPLOYEE (
Employee_ID CHAR(3),
Employee_name CHAR(20),
CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);
使用这个新设置,所有 table 都已成功创建。您现在可以插入数据了。
旁注:我预见到 table ORDER_LINE
的问题:
主键应该是
Order_line_ID
而不是Sales_order_ID
Sales_order_ID
应该有一个引用SALE_ORDER(Sales_order_ID)
的外键约束。
考虑 ORDER_LINE
的新定义:
CREATE TABLE ORDER_LINE(
Order_line_ID CHAR(6),
Sales_order_ID CHAR(6),
Product_ID CHAR(5),
Quantity CHAR(3),
Line_total CHAR(5),
CONSTRAINT pk_Order_Line PRIMARY KEY (Order_line_ID),
FOREIGN KEY (Product_ID) REFERENCES PRODUCT (Product_ID),
FOREIGN KEY (Sales_order_ID) REFERENCES SALES_ORDER(Sales_order_ID)
);