2009-01-06 52 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