2014-11-03 32 views
0

因此,我建立了一个简单的数据库,并且我正试图测试它是否正常工作。我想弄清楚如何将多个条目放入订单表中。我需要订购#并且能够订购多个物品并使用多个托运人等。我似乎无法找到一种方法将数据正确地存入我​​的数据库。如何将多行插入到订单表中?

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

下面是引用表:

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

这里是我的Order表:

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

你的问题是,你必须定义一个表来保存订单,所以你只能有一个每个订单项目。通常我们通过有两个表来处理这种情况:包含整个订单信息的标题和每个订购商品的行表。

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

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

既然您有两张桌子,您可以使用多行来轻松创建订单。


关于正常实践的问题,订单应该有一个CUSTOMER。这将是ORDER_HEADER的一个属性。你也有一个SHIPPER表,但不要使用它。这也可能是ORDER_HEADER的一个属性。

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

相关问题