繁体   English   中英

用外键约束更改MySQL表

[英]Alter MySQL table with foreign key constraint

有两个表新闻和语言。 这是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)不为空,添加键
(ietf_language_tag),添加约束news_fkey1外键(ietf_language_tag)
参考语言(ietf_language_tag)ON删除无操作更新无操作
错误代码:1215。无法添加外键约束0.437秒

字符集问题

无论newslanguage有不同的字符集latin1newsutf8language

FOREIGN_KEY_CHECKS

即使字符集相同,但是如果在news表上有如下记录,也会出现错误。

错误1452(23000):无法添加或更新子行:外键约束失败( db_name#sql-296_72a7a ,CONSTRAINT news_fkey1键( ietf_language_tag )参考languageietf_language_tag )删除ietf_language_tag更新不ietf_language_tag行动

可以通过SET FOREIGN_KEY_CHECKS = 0;来解决此问题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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM