在单个事务中出现多个ALTER TABLE语句

时间:2011-06-29 19:11:32

标签: mysql alter-table

我在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) 

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

更新:根据以下Ike的建议,我在上面的SHOW ENGINE INNODB STATUS查询后运行了ADD FOREIGN KEY并获得了以下内容:

------------------------
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)也非常多存在。这些语句一次只运行一次,那么为什么一次运行时它们会导致错误?

1 个答案:

答案 0 :(得分:3)

DDL无法回滚,因此您不应在事务中运行它。您可以在manual

中详细了解相关内容

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