【问题标题】:MySql and inserting data in a link table, how to?MySql并在链接表中插入数据,如何?
【发布时间】:2009-01-06 21:11:57
【问题描述】:

MySql(第 4 版)中从 PHP thtree Inserts 写入并确保我们可以正确链接表的技巧是什么。

[Table1]-[LinkTable]-[Table2]

在 PHP 代码中,我创建了一个在表 1 中添加 1 行的插入,以及在表 2 中添加另一行的另一个插入。我得到两行 PK(主键)和两个返回我最后一行的 SELECT每个表。这样我从表 1 和表 2 中获取 PK(自动增量)并将其插入到链接表中。

问题是这不是原子的,现在我得到了很多交易,但它没有正确链接。

如何在 MySQL 4 中保存数据的 2 个表之间建立链接?我不能使用任何存储过程。

【问题讨论】:

  • 嘿,你回来了!我以为在 Jeff 重构之后我们失去了你。很高兴看到它。
  • 我的声誉已经调整,我不打算像以前那样过度活跃。我正在努力赶上所有的新东西,在博客文章中写回一些东西。很高兴见到你,保罗!

标签: php mysql


【解决方案1】:

好吧,如果您能够使用 InnoDB 表(而不是 MyISAM),那么您可以使用事务。这是一些粗略的代码

<?php

//  Start a transaction
mysql_query( 'begin' );

//  Execute the queries
if ( mysql_query( "insert into table_one (col1, col2) values('hello','world')" ) )
{
    $pk1 = mysql_insert_id();
    if ( mysql_query( "insert into table_two (col1, col2) values('foo', 'bar')" ) )
    {
        $pk2 = mysql_insert_id();
        $success = mysql_query( "insert into link_table (fk1, fk2) values($pk1, $pk2)" );
    }
}

//  Complete the transaction
if ( $success )
{
    mysql_query( 'commit' );
} else {
    mysql_query( 'rollback' );
}

如果您不能使用 InnoDB 表,那么我建议您查看 Unit Of Work 模式。

【讨论】:

  • 这是 MyISAM。我会检查我是否可以做一些改变。
  • +1 获取信息,我将首先尝试 pendexgabo 解决方案,因为它需要的更改较少。
【解决方案2】:

你的问题在这里:

返回每个表的最后一行的 SELECT。

如果您执行以下操作:SELECT MAX(id) FROM table 您可能会得到错误的交易 ID。

这是一种常见的多对多关系

正如 BaileyP 所说,您应该使用函数 mysql_insert_id()。

http://ar2.php.net/mysql_insert_id

你可以阅读

检索前一个 INSERT 查询为 AUTO_INCREMENT 列生成的 ID。

所以不要关心其他进程是否在同一个表中插入一行。您将始终获得当前连接的最后一个 ID。

【讨论】:

  • 我会在完成其他一些任务后立即查看此方法。如果它像我希望的那样工作,你会为我节省一些美好的时间!
  • +1,因为您向我学习了这种方法。不知道mysql_insert_id。如果您的解决方案有效,我会接受您的回答。很快再见。
  • 这个解决方案效果很好。还没有在多线程的高峰期进行测试,但我认为这会很好,因为 InnoDB 对于这个版本来说要做的事情太多了。我以后可能会试试。谢谢
猜你喜欢
  • 2023-04-04
  • 2010-11-03
  • 2013-04-28
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多