oracle 标准化后创建表时出现问题

nhaq1z21  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(129)

我被赋予了一项任务,使销售订单正常化,创建关系模式并将数据输入到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

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)
);

我可以创建表EmployeeCustomerProductSales_order,但不能创建Order_line
我被告知该表或视图不存在。
这是什么意思?
我是不是正常化了?
我是否设计了关系模式错误?

ghg1uchk

ghg1uchk1#

当我在this db fiddle中运行您的代码时,创建表SALE_ORDER失败,并显示以下消息:
ORA-02270:此列列表没有匹配的唯一键或主键
这是因为这个外键:

CONSTRAINT fk_Order FOREIGN KEY (Employee_ID) REFERENCES EMPLOYEE (Employee_ID),

潜在的问题是您已经将Employee_name定义为表EMPLOYEE的主键。

CREATE TABLE EMPLOYEE (
    Employee_ID CHAR(3), 
    Employee_name CHAR(20),  
    CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);

这似乎不是一个明智的选择。在真实的生活中,两个不同的员工可能有相同的名字。相反,您可能希望使用Employee_ID作为EMPLOYEE的主键。
考虑表EMPLOYEE的以下定义:

CREATE TABLE EMPLOYEE (
    Employee_ID CHAR(3), 
    Employee_name CHAR(20),  
    CONSTRAINT pk_Employee PRIMARY KEY (Employee_ID)
);

使用此新设置,所有表都将成功创建。您现在可以插入数据。

Demo on DB Fiddle

旁注:我预见到表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)
);

相关问题