您不应该将order_items
表中的订单 ID 字段设置为auto_increment
. orders
在表使用LAST_INSERT_ID()
函数中插入行时获取自动生成的 id 的值。
可以有自己的auto_increment
id 列在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;