MySql(第4版)中从PHP thtree Inserts编写的技巧是什么,并确保我们可以正确链接表。
[Table1]-[LinkTable]-[Table2]
在PHP代码中,我创建一个Insert,在表1中添加1行,另一个Insert在表2中添加另一行。我得到两行SELECT(主键),其中两个SELECT返回给我最后一行每张桌子。这样我从表1和表2中得到PK(自动增量),然后将其插入链接表。
问题在于它不是原子的,现在我得到了很多事务,它没有正确链接。
如何在MySQL 4中保存数据的两个表之间建立链接?我不能使用任何库存程序。
答案 0 :(得分:2)
好吧,如果您能够使用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模式。
答案 1 :(得分:1)
你的问题在这里:
SELECT,返回每个表的最后一行。
如果您执行了类似的操作:SELECT MAX(id)FROM table
您的交易ID可能会错误。
这是一种常见的多对多关系
正如BaileyP所说,你应该使用函数mysql_insert_id()。
在http://ar2.php.net/mysql_insert_id
你可以阅读
检索先前INSERT查询为AUTO_INCREMENT列生成的ID。
所以不要在意其他进程是否在同一个表中插入一行。你总会获得当前连接的最后一个ID。