2009-01-06 32 views
1

MySql(版本4)从PHP插入插入中写入的技巧是什么,并确保我们可以正确链接表。MySql并在链接表中插入数据,如何?

[Table1]-[LinkTable]-[Table2] 

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

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

如何在MySQL 4中的2个表之间建立一个链接来保存数据?我无法使用任何库存程序。

+0

嘿,你回来了!我认为在杰夫重构之后我们已经失去了你。很高兴看到它。 – 2009-01-06 21:15:11

+0

我的声望已经调整过了,我不打算像我一样过度活跃。我试图赶上所有新的东西,在博客文章中回复几件事情。很高兴见到你,保罗! – 2009-01-06 21:20:00

回答

1

你的问题是在这里:

将选择返回我的每个表的最后一排。

如果你做了这样的事情:SELECT MAX(id)FROM table你可以为你的交易得到一个错误的id。

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

为BaileyP说,你应该使用函数mysql_insert_id()。

http://ar2.php.net/mysql_insert_id

您可以阅读

检索由以前的INSERT查询为AUTO_INCREMENT列生成的ID。

所以不关心其他进程是否在同一个表中插入一行。你总是会得到当前连接的最后一个ID。

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模式。

+0

这是MyISAM。我会检查我是否可以做一些改变。 – 2009-01-06 21:32:28