【问题标题】:Alter MySQL table with foreign key constraint使用外键约束更改 MySQL 表
【发布时间】:2014-02-06 07:09:00
【问题描述】:

有两个表格新闻和语言。 这是 MySQL 中的原始表:

CREATE TABLE `news` (
`news_id` int(11) NOT NULL AUTO_INCREMENT,
`fleet_id` int(11) NOT NULL,
`channel_id` int(11) NOT NULL,
`effective_from` date NOT NULL,
`effective_to` date NOT NULL,
`news` text,
PRIMARY KEY (`news_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `language` (
`ietf_language_tag` varchar(5) NOT NULL,
`endonym` varchar(32) NOT NULL,
`exonym` varchar(32) NOT NULL,
 PRIMARY KEY (`ietf_language_tag`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/* 发出 alter table 命令 */

ALTER TABLE news
ADD ietf_language_tag varchar(5) NOT NULL,
ADD KEY (ietf_language_tag) ,
ADD CONSTRAINT news_fkey1 FOREIGN KEY (ietf_language_tag) REFERENCES   
language(ietf_language_tag) ON DELETE NO ACTION  ON UPDATE NO ACTION ;

/* 出现错误 */

错误:

14:57:51 ALTER TABLE 新闻添加 ietf_language_tag varchar(5) NOT NULL, ADD KEY
(ietf_language_tag) , 添加约束 news_fkey1 外键 (ietf_language_tag)
REFERENCES language(ietf_language_tag) ON DELETE NO ACTION ON UPDATE NO ACTION
错误代码:1215。无法添加外键约束 0.437 秒

【问题讨论】:

  • 通过你的sql,我没有t get the same error as yours, but after I changed column type from varchar to int, it works, Im 不确定你的问题是否和我一样,请尝试。

标签: mysql alter


【解决方案1】:

字符集问题

newslanguage 的字符集不同,latin1 对应于newsutf8 对应于language

FOREIGN_KEY_CHECKS

即使字符集相同,如果news 表中有如下记录,也会报错。

错误 1452 (23000): 无法添加或更新子行:外键约束失败 (db_name.#sql-296_72a7a, CONSTRAINT news_fkey1 FOREIGN KEY (ietf_language_tag) REFERENCES language (ietf_language_tag ) ON DELETE NO ACTION ON UPDATE NO ACTION)

这个问题可以用SET FOREIGN_KEY_CHECKS = 0;修复

mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE news
    -> ADD ietf_language_tag varchar(5) NOT NULL,
    -> ADD KEY (ietf_language_tag) ,
    -> ADD CONSTRAINT news_fkey1 FOREIGN KEY (ietf_language_tag) REFERENCES
    -> language(ietf_language_tag) ON DELETE NO ACTION  ON UPDATE NO ACTION ;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多