2015-04-24 17 views
3

我已经设置有外键InnoDB表,我想默认的字符集从latin1_swedish_ci这些表更改为utf8_general_ci,我试图运行下面的查询:如何使用外键更改InnoDB表中的字符集?

ALTER TABLE test.PAYMENT DROP FOREIGN KEY PAYMENT_ibfk_1; 

但它给我这个错误:

ERROR 1025 (HY000): Error on rename of './test/#sql-1fa_24f43' to './test/PAYMENT' (errno: 150) 

我试过执行此设置foreign_key_checks=0;甚至通过禁用键,但仍然会得到相同的错误。

+0

SET FOREIGN_KEY_CHECKS = 0;完全适用于我的MySQL 5.6.19b,InnoDB表,从latin1转换为utf8,utf8_unicode_ci –

+1

@Vajk这很可能是因为版本的差异,因为我在MySQL-5.5.25上做了这个。感谢您提到它在MySQL-5.6中的工作 –

回答

1

我从所有的参考表和主表

alter table test.PAYMENT drop foreign key PAYMENT_ibfk_1; 
alter table test.ORDER_DETAILS drop foreign key ordr_dets_ibfk_1; 
alter table test.TRANSACTION drop foreign key transaction_ibfk_1; 

下降外键再后来改变了所有表和更改字符集

alter table test.PAYMENT CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
alter table test.TRANSACTION CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
alter table test.ORDER_DETAILS CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

然后再应用于外键

alter table niclient.PAYMENT add foreign key PAYMENT_ibfk_1 (paymentTransId) references `TRANSACTION` (`transId`) ON DELETE CASCADE; 
alter table niclient.ORDER_DETAILS add foreign key ordr_dets_ibfk_1 (ordrDetTransId) REFERENCES `TRANSACTION` (`transId`) ON DELETE CASCADE; 
alter table niclient.TRANSACTION add foreign key transaction_ibfk_1 (transCompId) REFERENCES `COMPANY_DETAILS` (`compId`) ON DELETE CASCADE; 
解决它

它完美地工作得很好:-)