以下查询成功,但是当我在订单ID中输入空值并为项目ID输入不同的值(列中不存在的值)时,订单ID仍然会递增。如何保留相同的订单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)
);
答案 0 :(得分:0)
问题源于尝试在单个表中执行一对多(order to items)关系。这将结束严重。你需要两个。一个用于订单,一个用于订单中的商品。无论好坏,这都是关系数据库列表的方式。
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_date
和order_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 = ?