我在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
)也非常多存在。这些语句一次只运行一次,那么为什么一次运行时它们会导致错误?
答案 0 :(得分:3)
DDL无法回滚,因此您不应在事务中运行它。您可以在manual。
中详细了解相关内容至于您遇到的错误,您应该运行SHOW ENGINE INNODB STATUS\G
并查看LATEST FOREIGN KEY ERROR
部分,了解失败的原因。