【问题标题】:Problems creating table after normalisation规范化后创建表的问题
【发布时间】:2020-03-06 01:27:19
【问题描述】:

我的任务是规范化销售订单、创建关系模式并将数据输入 SQL 开发人员。

我已经标准化为 3NF 并得到了这个:

Customer(Customer_ID, Customer_name) ... 主键 = Customer_ID

Employee(Employee_ID, Employee_name) ... 主键 = Employee_ID

Sales_Order(Sales_order_ID, Employee_ID, Customer_ID, Sale_date, Order_total) ... 主键 = Sales_order_ID ... 外键 = Employee_ID, Customer_ID

Order_Line(Sales_order_ID, Product_ID, Quantity, Line_total) ... 复合键 = Sales_order_ID ... 外键 = Product_ID

Product(Product_ID, Product_name, Product_price, Product_colour) ... 主键 = Product_ID

然后我输入了表格,这是我的 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)
);

我可以输入表格EmployeeCustomerProductSales_order,但无法输入Order_line

我被告知表或视图不存在!

这是什么意思?

我的归一化有误吗?

我是否错误地设计了关系模式?

任何帮助将不胜感激

【问题讨论】:

  • 感谢您为我排版 Barbaros
  • 那些CHAR 列应该真正使用标准VARCHAR2CHAR 是一种奇怪的 ANSI 兼容类型,提供没人需要的空白填充。
  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 请每个帖子问一个问题。 Why is “Can someone help me?” not an actual question?
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS/产品和 DDL 的 SQL,其中包括约束和索引以及表格格式的初始化。
  • 嗨,philipxy,如果这是一个常见问题,我深表歉意,但我没有找到重复的问题,并且花了一整天的时间试图解决我的问题,相信我。以后我会考虑周到的,感谢您提醒我或网站的规则。

标签: oracle database-normalization


【解决方案1】:

当我在 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)
);

【讨论】:

  • GMB 非常感谢你,我今天真的花了 6 个小时来拉扯我的大脑,以为我在这里搞砸了!我真的不能感谢你!我已成功将表格输入到 SQL 开发人员中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2012-07-30
  • 2013-01-25
  • 2021-07-10
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多