【问题标题】:Thread safe way to get auto incremented primary key inserted into another table (so they can be joined later)将自动递增的主键插入另一个表的线程安全方法(以便以后可以加入)
【发布时间】:2011-10-15 20:43:18
【问题描述】:

好像有两种方法,第一种是这样的:

$result = mysql_query("SHOW TABLE STATUS LIKE 'table_name'");
$row = mysql_fetch_array($result);
$nextId = $row['Auto_increment'];
mysql_free_result($result);

$sql = mysql_query("INSERT the information you want in the main table")

然后您可以在所有相关表中插入 $nextid 作为外键。

另一种方法使用last insert id:

START TRANSACTION;
INSERT INTO files (file_id, url) VALUES (NULL, 'text.doc');
INSERT INTO grades (file_id, grade) VALUES (LAST_INSERT_ID(), 'some-grade');
COMMIT;

这两个线程都是安全的吗? IE,如果我有两个 php 脚本同时运行两个 mysql 线程并且它们同时插入到主表中,相关联的表会收到正确的主 id 外键还是会发生混淆或冲突?

谢谢。

【问题讨论】:

    标签: php mysql primary-key acid


    【解决方案1】:

    使用第二个(或mysql_insert_id()),因为它是multi-user safe。该事务仅出于一致性原因需要,而不是LAST_INSERT_ID()。此外,您应该使用mysqli_*() 而不是mysql_*(),因为它是改进的数据库访问库。

    【讨论】:

    • 是的,这就是为什么它应该优于mysql_*()
    【解决方案2】:

    最后一个更好,使用 INSERTED_ID!另一个选项也可以,但是如果您有更多人使用同一页面,则可能会出错。

    虽然这不太可能。

    【讨论】:

      【解决方案3】:

      我认为使用 last_insert_ID() 的触发器来确保在插入操作后立即触发代码是最好的方法,假设您希望在每次插入后都发生这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        相关资源
        最近更新 更多