两列主键,自动增量和外键

时间:2015-04-22 15:49:29

标签: mysql auto-increment foreign-key-relationship composite-primary-key

以下查询成功,但是当我在订单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)
);

1 个答案:

答案 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_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 = ?