如何在Order表中插入多行?

时间:2014-11-03 06:58:05

标签: sql oracle database-design sqlplus data-modeling

所以我建立了一个简单的数据库,我正在尝试测试它是否正常工作。我试图找出如何在Order表中获得多个条目。我需要订购#并能够订购多件商品并使用多个托运人等。我似乎无法找到一种方法将数据正确地存入我​​的数据库。

以下是我设置数据库的方法。有人可以向我解释如何将我的测试数据导入数据库。

以下是参考表:

CREATE TABLE Product_Table (
ProductID INT NOT NULL,
Product_Name char(50) NOT NULL,
Product_Cost number(9,2) NOT NULL,
Product_In_Stock INT NOT NULL,
CONSTRAINT Products_PK PRIMARY KEY (ProductID)
);

CREATE TABLE Payment_Terms_Table (
PayTermNum INT NOT NULL,
Payment_Time_Frame CHAR(20) NOT NULL,
CONSTRAINT Payment_Terms_PK PRIMARY KEY (PayTermNum)
);


CREATE TABLE Shipper_Table (
ShipperNum INT NOT NULL,
Shipper_Name CHAR(50) NOT NULL,
Shipper_Phone CHAR(22) NULL,
CONSTRAINT ShipperNum_PK PRIMARY KEY (ShipperNum)
);

CREATE TABLE Supplier_Table (
SupplierID INT NOT NULL,
Supplier_Name CHAR(50) NOT NULL,
Sup_Address CHAR(50) NOT NULL,
Sup_City CHAR(20) NOT NULL,
Sup_State CHAR(20) NOT NULL,
Sup_Zip CHAR(9) NOT NULL,
Sup_Phone  CHAR(22) NULL,
ShipperNum INT NOT NULL,
PayTermNum INT NOT NULL,
CONSTRAINT Supplier_PK PRIMARY KEY (SupplierID),
CONSTRAINT ShipperNum_Relationship FOREIGN KEY (ShipperNum)
        REFERENCES Shipper_Table (ShipperNum),
CONSTRAINT PayTermNum_Relationship FOREIGN KEY (PayTermNum)
        REFERENCES Payment_Terms_Table (PayTermNum)
);

这是我的订单表:

CREATE TABLE Order_Table (
OrderID INT NOT NULL,
ProductID INT NOT NULL,
SupplierID INT NOT NULL,
Wholesale_Price NUMBER (9,2) NOT NULL,
Units_Ordered INT NOT NULL,
Order_Date DATE DEFAULT SYSDATE NOT NULL,
Order_Received DATE NULL,
CONSTRAINT Order_PK PRIMARY KEY (OrderID),
CONSTRAINT ProductID_Relationship FOREIGN KEY (ProductID)
    REFERENCES Product_Table (ProductID),
 CONSTRAINT SupplierID_Relationship FOREIGN KEY (SupplierID)
    REFERENCES Supplier_Table (SupplierID)
);

1 个答案:

答案 0 :(得分:1)

您的问题是您有一个定义的一个表来保存订单,因此每个订单只能有一个项目。通常我们通过两个表来处理这种情况:一个包含整个Order信息的Header和一个每个有序Item的Line表。

CREATE TABLE Order_Header (
OrderID INT NOT NULL,
Order_Date DATE DEFAULT SYSDATE NOT NULL,
Order_Received DATE NULL,
CONSTRAINT Order_PK PRIMARY KEY (OrderID) 
)
/

CREATE TABLE Order_Line (
OrderID INT NOT NULL,
LineNo INT NOT NULL,
ProductID INT NOT NULL,
SupplierID INT NOT NULL,
Wholesale_Price NUMBER (9,2) NOT NULL,
Units_Ordered INT NOT NULL,
CONSTRAINT Order_Line_PK PRIMARY KEY (OrderID, LineNo),
CONSTRAINT Order_Line_Header_FK FOREIGN KEY (OrderID)
    REFERENCES Order_Header (OrderID)
CONSTRAINT ProductID_Relationship FOREIGN KEY (ProductID)
    REFERENCES Product_Table (ProductID),
 CONSTRAINT SupplierID_Relationship FOREIGN KEY (SupplierID)
    REFERENCES Supplier_Table (SupplierID)
)
/

我已经声明了一个复合主键,因为它更容易理解发生了什么。

现在您有两个表,您可以轻松创建包含多行的订单。


关于正常做法的主题,订单应该有一个客户。这将是ORDER_HEADER的一个属性。你也有一个SHIPPER表,但不要使用它。这可能是ORDER_HEADER的一个属性。

此外,您的命名惯例很难看。不需要包含_TABLE:只需为它们代表的东西命名对象。同样,您的外键需求也是不透明的;在这个玩具示例中并不重要,但在真实的数据库中,您会发现在FK名称中指定子表和父表是有帮助的。