插入表但不确定外键

时间:2013-08-27 02:04:28

标签: mysql

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。

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

3 个答案:

答案 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