表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作为订单的外国人。
oid是Order
表中的自动增量
但是在order_item
表中它不是(不知道那是不是正确的方法)
我有一个insert语句,它同时插入到两个表中。我想知道是否有权使order_item自动增量?因为不是其他方式我可以让它从订单表复制oid。
解决这个小问题的最佳方法是什么。
答案 0 :(得分:1)
您不应将order_items
表格中的订单ID字段设为auto_increment
。在orders
表中使用LAST_INSERT_ID()
函数插入行时,要获取自动生成的id值。
在auto_increment
中拥有自己的order_items
id列是可以的。有时它非常方便(例如,当你想要更新单个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;
答案 1 :(得分: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')
BTW表order-oid应该是主键
答案 2 :(得分: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