【问题标题】:Issue with multiple ALTER TABLE statements in a single transaction单个事务中存在多个 ALTER TABLE 语句的问题
【发布时间】:2011-06-29 19:11:31
【问题描述】:

我在 MySQL 5.1.41 上的同一事务中执行多个 ALTER TABLE 语句时遇到问题。在 5.1.49

上有另一个开发人员运行相同的代码并且没有这些问题

同一张表上的多个ADD FOREIGN KEY 语句工作正常:

ALTER TABLE school_state ADD FOREIGN KEY (school_id) REFERENCES school(id) ON DELETE CASCADE; 
ALTER TABLE school_state ADD FOREIGN KEY (state_id) REFERENCES state(id) ON DELETE CASCADE; 

但是在不同的表中,我得到一个神秘的错误:

ALTER TABLE school_state ADD FOREIGN KEY (school_id) REFERENCES school(id) ON DELETE CASCADE; 
ALTER TABLE school_state ADD FOREIGN KEY (state_id) REFERENCES state(id) ON DELETE CASCADE; 
ALTER TABLE publisher_login ADD FOREIGN KEY (publisher_id) REFERENCES publisher(id); 

Can't create table 'my_database.#sql-2cd_45' (errno: 150) 

更奇怪的是,多个 DROP FOREIGN KEY 语句即使跨同一个表也会失败:

ALTER TABLE school_state DROP FOREIGN KEY school_state_ibfk_2; 
ALTER TABLE school_state DROP FOREIGN KEY school_state_ibfk_1; 

Error on rename of './my_database/school_state' to './my_database/#sql2-2cd-45' (errno: 152) 

我真的必须将每个单个语句作为它自己的事务来执行吗?因为这种方式违背了原子交易的目的。

更新:根据下面艾克的建议,我在上面的 ADD FOREIGN KEY 查询之后运行 SHOW ENGINE INNODB STATUS 并得到以下信息:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110630  8:01:12 Error in foreign key constraint of table my_database/#sql-2cd_95:
FOREIGN KEY (publisher_id) REFERENCES publisher(id):
Cannot resolve column name close to:
) REFERENCES publisher(id)

老实说,我仍然不明白问题是什么,因为它引用的键 (publisher.id) 确实存在,并且打算成为外键的字段 (publisher_login.publisher_id) 也非常存在。这些语句一次运行良好,为什么一次运行它们会导致错误?

【问题讨论】:

    标签: mysql alter-table


    【解决方案1】:

    DDL 无法回滚,因此您不应该在事务中运行它。您可以在manual 中阅读更多相关信息。

    至于您遇到的错误,您应该运行SHOW ENGINE INNODB STATUS\G 并查看LATEST FOREIGN KEY ERROR 部分以找出失败的原因。

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2011-09-04
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多