【问题标题】:MySQL Multi-Insert? MySQL DB integrity after failed INSERTMySQL 多插入?插入失败后的 MySQL 数据库完整性
【发布时间】:2010-08-26 14:51:11
【问题描述】:

是否可以一次将一行插入到多个表中?如果你做几个由一个ID相关的表;如果 INSERT 失败,确保保持完整性的最佳方法是什么?

【问题讨论】:

  • “一次将一行插入多个表”听起来像是糟糕的数据库设计。将值插入到一个表中,获取该行的 id(主键)并相应地使用 id 值更新其他表。
  • 所以我应该在同一张表中放置超过 200 个字段和超过 100 万个条目?

标签: php mysql insert myisam database-integrity


【解决方案1】:

这正是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命令(例如CREATE,ALTER,DROP)不能回滚!

【讨论】:

  • 谢谢!我的表是 MyISAM;我将使用 >>ALTER TABLE mytable ENGINE=InnoDB; 进行转换
【解决方案2】:

使用交易,卢克。

【讨论】:

  • MySQL 并不总是有事务,这取决于引擎类型。
【解决方案3】:

MySQL 可以像这样insert multiple rows(搜索“多行”):

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

但是,除了返回记录数、重复数和警告数的查询之外,没有办法知道插入了什么,什么不是由于违反约束而插入的。您也不能使用last_insert_id() 来计算新行的 ID,因为它只返回创建的 LAST id,而不是一组 id。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多