1

桌子Order

oid  payerName address
1       james    1 brown
2       smith     2  smith

桌子 order_item

oid  type  price
1    AN94  3000
2    AK47  1000

order_item 作为 Order 的外来项。

oid 是OrderTable 中的自动增量,但在order_itemtable 中不是(不知道这是否是正确的方法)

我有一个插入语句,它同时插入两个表。我想知道将 order_item oid 设为自动增量是否也是正确的?因为这不是我可以让它从订单表中复制 oid 的其他方式。

解决这个小问题的最佳方法是什么。

4

3 回答 3

1

您不应该将order_items表中的订单 ID 字段设置为auto_increment. orders在表使用LAST_INSERT_ID()函数中插入行时获取自动生成的 id 的值。

可以有自己的auto_incrementid 列在order_items. 有时它会非常方便(例如,当您想要更新单个order_item行时,您可以通过其自己的 id 而不是通过列的组合来引用它)

话虽如此,提议的架构可能看起来像

CREATE TABLE orders
(`order_id` int not null auto_increment primary key, 
 `payerName` varchar(5), 
 `address` varchar(8)
);
CREATE TABLE order_items
(`order_item_id` int not null auto_increment primary key, 
 `order_id` int, 
 `type` varchar(4), 
 `price` decimal(19,2),
 foreign key (order_id) references orders (order_id)
);

为了清楚起见,在我的示例中有意重命名了 id 列的名称。你不必明显地改变你的。

现在插入一个订单和你做的订单项目

INSERT INTO orders (`payerName`, `address`)
VALUES ('james', '1 brown');

INSERT INTO order_items (`order_id`, `type`, `price`)
VALUES (LAST_INSERT_ID(), 'AN94', 3000);

这是SQLFiddle演示


您没有在问题中提到 PDO,但使用它的代码可能看起来像这样

try {
    $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'userpwd');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    //$db->beginTransaction();

    $query=$db->prepare("INSERT INTO orders (`payerName`, `address`) VALUES (?, ?)");
    $query->execute(array('james', '1 brown'));

    $order_id = $db->lastInsertId();

    $query=$db->prepare("INSERT INTO order_items (`order_id`, `type`, `price`) VALUES (?, ?, ?)");
    $query->execute(array($order_id, 'AN94', 3000));

    //$db->commit();
} catch (PDOException $e) {
    echo "Exeption: " .$e->getMessage();
}
$query = null;
$db = null;
于 2013-08-27T02:31:10.147 回答
0

由于 order_item->oid 依赖于 order->oid,所以 Order 应该在 order_item 之前先存在

这个是对的,因为 oid(1) 存在于订单表中

insert into order_item (oid,type,price) values('1','AN94','3000')

这是错误的,因为 oid(3) 在订单表中不存在

insert into order_item (oid,type,price)values('3','sample','3333')

顺便说一句,表 order-oid 应该是主键

于 2013-08-27T03:03:12.473 回答
0

订单

order_id ( auto inc )、payer_name、地址

订购商品

order_item_id( auto inc ), order_id , item_id , 类型, 数量, unit_price

产品

item_id ( auto inc ), item_name, item_unit_price, item_group

于 2013-08-27T03:03:19.020 回答