2010-08-26 110 views
1

是否可以一次向多個表中插入一行?如果你用一個ID來做幾個表;在INSERT失敗的情況下,確保完整性的最佳方法是什麼?MySQL多插入? MySQL數據庫完整性失敗後INSERT

+1

」一次插入一行到多個表「聽起來像一個不好的數據庫設計。將值插入一個表中,獲取該行的id(主鍵)並相應地使用id值更新其他表。 – Chris 2010-08-26 14:53:07

+0

所以我應該把200個字段和超過100萬條目放在同一個表中? – KeatsKelleher 2010-08-27 13:00:50

回答

4

這正是transactions的用途。如果有任何命令失敗,因爲START TRANSACTION整個事情回滾:

START TRANSACTION; 
INSERT INTO sometable VALUES(NULL,'foo','bar'); 
INSERT INTO someothertable VALUES (LAST_INSERT_ID(),'baz'); 
COMMIT; 

這是MySQL,你不能用MyISAM表使用事務處理(你需要的表使用一些引擎支持該,可能InnoDB)。

這將永遠不會被插入到表(通常你有一些分支,如一個IF):

START TRANSACTION; 
INSERT INTO sometable VALUES(NULL,'data','somemoredata'); 
ROLLBACK; 

警告:那些更改數據庫結構 SQL命令(例如CREATEALTERDROP)無法回滾!

+1

謝謝!我的表是MyISAM;我將與 轉換>> ALTER TABLE mytable ENGINE = InnoDB; – KeatsKelleher 2010-08-26 15:05:57

1

使用交易,盧克。

+0

根據引擎類型的不同,MySQL並不總是有事務。 – coffeepac 2010-08-26 14:56:59

0

MySQL能夠insert multiple rows(搜索「多行」)是這樣的:

INSERT INTO table (field1, field2, ...) VALUES (value1, value2), (value3, value4), etc... 

然而,有沒有辦法告訴什麼讓插入,什麼不是因違反約束,超出了查詢,返回記錄數,重複數和警告數。您也不能使用last_insert_id()來確定新行的ID,因爲它只返回創建的LAST ID,而不是一組ID。

如果您需要保證完整性,請使用單行插入語句和事務。 「