2011-06-29 25 views
1

我在MySQL 5.1.41上执行同一事务中的多个ALTER TABLE语句时出现问题。有运行相同的代码,并有上49年5月1日在单个事务中发出多个ALTER TABLE语句

多没有这些问题在同一个表做工精细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)也非常存在。这些语句一次只能运行一次,所以为什么一次运行时会导致错误?

回答

3

DDL不能被回滚,所以你不应该在事务中运行它。你可以在manual中阅读更多。

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

相关问题