【发布时间】: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