2010-08-26 113 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。

如果您需要保证完整性,请使用单行插入语句和事务。 “