【问题标题】:Mysql tables relationships / Foreign key?Mysql表关系/外键?
【发布时间】:2014-11-22 09:50:35
【问题描述】:

我很难弄清楚如何在 PHP/MySql 项目中链接数据库行。我的订单提交脚本目前将信息拆分并存储到 2 个表中。

第一个称为“订单”,包含:

$OrderId, $CustomerName, $CustomerEmail, $OrderTotal, $OrderTaxes
//and other infos about the ORDER

第二个称为“项目”,包含所有已购买的产品信息:

$ProductId, $OrderedQty 
//for each one and such...

必须这样,因为“项目”表将由不同的“部门”搜索,这些部门只会显示他们负责的订单部分。 但他们都必须获得“订单”信息才能发货。

知道“OrderId”列是在“Orders”表本身上生成的主键,并且我的 INSERT TO 命令都同时执行,我如何链接两个表中的“Order Id”列?

我必须生成一些随机密钥来匹配它们吗?

如果我要使用外键,数据库如何知道哪个产品与哪个订单是同时提交的?

或者在“订单”中插入是否足够快 -> SELECT $OrderID -> 在“项目”中插入?

通常如何做到这一点?想不出来这个。

提前感谢您的宝贵帮助!

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    购买的产品信息应该有一个额外的列,即购买的产品表,称为 orderid,以便您知道哪些产品属于哪个订单。 至于插入数据库,这取决于您用来执行查询的内容。一些查询类允许您一次运行多个查询语句,如果是这种情况,您可以运行类似于:

    INSERT INTO Orders (OrderId, CustomerName, CustomerEmail, OrderTotal, OrderTaxes) Values(...)
    SET @order_id = LAST_INSERT_ID();
    INSERT INTO boughtItems (OrderId,ProductId,OrderedQty) Values (@order_id, :productid_1, :name_1),(@order_id, :productid_2, :name_2),(@order_id, :productid_3, :name_3) ....
    

    在订单情况下,您需要对订单运行插入语句,然后获取主键。 看看这些链接:

    在其他情况下,您可以使用允许您获取最后插入的 id 的类。此 id 是连接绑定的,因此应该没有问题(只要插入有效,您就不会在一个查询中进行多次插入,不会进行回滚或其他奇怪的事情)。 在这种情况下,您将执行插入,然后调用辅助函数来获取插入的 id。 请参阅以下链接:

    或者,您也可以执行 2 个查询。首先是插入查询,然后是这个查询:

    SELECT LAST_INSERT_ID() as id;
    

    其他相关链接:

    【讨论】:

    • 当 2 个人同时发送订单时,LAST_INSERT 可能会返回错误的 ID 对吗?此外,“在购买的产品表中有一个名为 orderid 的额外列,因此您知道哪些产品属于哪个订单”是我想要实现的目标,但我必须在尚未生成此 ID 值时获取它!?我做错了什么
    • LAST_INSERT_ID 是连接绑定的,所以只要你不在同一个连接中随机使用其他查询,它应该是一致的。看到这个page
    • 你能为我解释一下“连接绑定”吗?对不起:)
    • 通常你在 php.ini 中连接到一个 mysql 服务器。基本上你建立一个连接(使用 mysql_connect(...) 或类似的函数)。连接绑定意味着 LAST_INSERT_ID() 将是每个连接。没有其他连接可以影响 LAST_INSERT_ID()。
    • 如果同时提交两个订单,技术上会发生什么?您是说“用户 1”连接在“用户 2”连接之前完成运行查询(再次插入/获取 ID/插入),从而无法为 LAST_INSERT_ID() 获得相同的值吗?
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多