外键列的唯一约束

时间:2015-04-06 11:57:59

标签: mysql sql reference constraints unique

我正在尝试将unique constraint添加到两个外键:

CREATE TABLE tagsInBlog(
    id_tag int(10) not null auto_increment,
    id_word int(10) not null,
    id_page int(11),
    PRIMARY KEY(id_tag),
    FOREIGN KEY (id_page) REFERENCES archive(id),
    FOREIGN KEY (id_word) REFERENCES tagwords(id_word)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

ALTER TABLE tagsinblog
  ADD UNIQUE tagBlogConstraint (id_word, id_page);

创建时我没有收到任何错误,但是当我尝试插入时,我得到:

  

MYSQL错误367421(无法将新标记数据保存到Mysql中):错误   1452(23000):无法添加或更新子行:外键   约束失败(sqse_001tagsinblog,CONSTRAINT   tagsinblog_ibfk_2外键(id_word)参考tagwords   (id_word))

当我尝试在没有唯一约束的同一个表中插入时,我没有任何问题。

1 个答案:

答案 0 :(得分:2)

我处理了你的问题陈述并假设了以下几点

您的archive表可能看起来像这样

CREATE TABLE IF NOT EXISTS `archive` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`descrp` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB

tagwords表可能看起来像这样

 CREATE TABLE IF NOT EXISTS `tagwords` ( `id_word` int(11) NOT NULL
 AUTO_INCREMENT, `descrp` varchar(10) NOT NULL DEFAULT '', 
 PRIMARY KEY (id_word) ) ENGINE=InnoDB

现在查询表tagsInBlog

CREATE TABLE tagsInBlog(
id_tag int(10) not null auto_increment,
id_word int(10) not null,
id_page int(11),
PRIMARY KEY(id_tag),
FOREIGN KEY (id_page) REFERENCES archive(id),
FOREIGN KEY (id_word) REFERENCES tagwords(id_word)
)ENGINE=INNODB DEFAULT CHARSET=utf8; 

更改表tagsInBlog

的查询
ALTER TABLE tagsinblog ADD UNIQUE tagBlogConstraint (id_word, id_page);

以下插入语句正常

INSERT INTO `test`.`tagsinblog` (`id_tag`, `id_word`, `id_page`) 
VALUES (NULL, '1', '1'), (NULL, '1', '2');

假设您在表tagswordsarchive

中分别有相应的条目

但是,如果您尝试将任何值插入foreign key哪个值在表archivetagwords中不存在,那么它将抛出以下错误

 #1452 - Cannot add or update a child row: a foreign key constraint fails  
 (`test`.`tagsinblog`, CONSTRAINT `tagsinblog_ibfk_2` 
 FOREIGN KEY (`id_word`) REFERENCES `tagwords` (`id_word`)) 

所以请确保在所有表格中都有正确的条目。

希望它有所帮助!