0

以下查询已成功完成,但是当我将空值输入到订单标识和项目标识的不同值(列中不存在的那些值)时,订单标识仍为越来越多。如何保留相同的订单ID?外键的使用方式有问题吗?两列主键,自动递增和外键

CREATE TABLE orders(
    orderid int not null auto_increment, 
    itemid int not null, 
    quantity int not null, 
    tot_price int not null, 
    cid int not null, 
    code varchar(10), 
    order_time time, 
    order_date date , 
    constraint order_pk primary key (orderid, itemid), 
    foreign key (itemid) references items(itemid), 
    foreign key (cid) references customer(cid), 
    foreign key (code) references coupon(code) 
); 
+2

您需要更好地标准化。你应该有第三个包含你的订单项目的表格,否则你会在每一行重复很多不必要的值。 –

+0

你正在使用哪种引擎类型? –

+0

作为一个附注,在不同的字段中有order_time和order_date是奇数。单个[DATETIME字段](https://dev.mysql.com/doc/refman/5.6/en/datetime.html)如何?这将使得范围计算变得更简单。索引会使事情变得更快。 – Schwern

回答

0

该问题源于尝试在单个表中执行一对多(订单到物料)关系。这将会严重结束。你需要两个。一个用于订单,一个用于订单中的物品。无论好坏,这都是关系数据库如何执行列表。

CREATE TABLE orders (
    orderid int not null primary key auto_increment, 
    cid int not null references customer(cid), 
    code varchar(10) references coupon(code), 

    when_ordered datetime, 
    INDEX(when_ordered) 
); 

CREATE TABLE items_in_an_order (
    orderid int not null references orders(id), 
    itemid int not null references items(id), 

    quantity int not null, 
    price_paid int not null 
); 

quantity移动到items_in_an_order。我将total_price更改为更具描述性的price_paid,这可能会描述更多您想要存储的内容。这会让你产生收据。

order_dateorder_time被不必要地分成两列。这使得比较和排序很尴尬。将它们放在一个DATETIME列中并编制索引可让您按日期/时间进行排序,并检查订单是否在日期/时间范围内。

要获得订单中的所有项目,do a join

SELECT items.itemid 
FROM items 
JOIN items_in_an_order io ON io.itemid = items.id 
WHERE io.orderid = ? 

要查找项目所有的订单,还要进行连接。

SELECT orders.id 
FROM orders 
JOIN items_in_an_order io ON io.orderid = orders.id 
WHERE io.itemid = ?