MySQL:ERROR 1022(23000):不能写;表格中的重复键' #sql-2b8_2'

时间:2014-05-30 12:01:34

标签: mysql sql

我要实现一个书店数据库。我创建了表格bookauthorpublisher。我想做出以下两种关系。

Book is written by Author.
Book is published by Publisher.

为了实现这些关系,我编写了一些SQL语句,如:

create table book(
            ISBN varchar(30) NOT NULL,
            title varchar(30) not null,
            author varchar(30) not null,
            stock Int,
            price Int,
            category varchar(30), 
            PRIMARY KEY ( ISBN )
);

create table author(
            author_id int not null auto_increment,
            author_name varchar(15) NOT NULL,
            address varchar(50) not null,
            ISBN varchar(30) not null,
            primary key (author_id)
);

alter table author add constraint ISBN foreign key (ISBN) references book (ISBN);

create table publisher(
            publisher_id int not null auto_increment,
            publisher_name varchar(15) NOT NULL,
            address varchar(50) not null,
            ISBN varchar(30) not null,
            primary key (publisher_id)
);

alter table publisher add constraint ISBN foreign key (ISBN) references book (ISBN);

当MySQL shell执行最后一个alter语句时,我收到此错误。

ERROR 1022 (23000): Can't write; duplicate key in table '#sql-2b8_2'

原来,外键不能指定两次?怎么了?提前谢谢。

7 个答案:

答案 0 :(得分:30)

您收到duplicate key error因为根据您对ISBN表的第一个alter语句,数据库中已存在名为author的约束

alter table author add constraint ISBN foreign key (ISBN) references book (ISBN);

尝试在Publisher

中使用不同的名称作为约束
alter table publisher add constraint ISBN1 
foreign key (ISBN) references book (ISBN);

答案 1 :(得分:4)

您的数据结构很奇怪。您应该拥有BooksAuthorsPublishers的实体表。这些将具有自动递增的ID作为主键和附加信息。例如,书籍有"标题"和" isbn"数字。作者有名字。出版商有姓名和地址。

然后你想要联结表。因此,书籍有一个或多个作者(忽略编辑和#34;编写其他作者的章节),作者可以写一本或多本书。这表示一个BookAuthors表,每本书和每位作者都有一行。

图书通常会有一个发布商,因此这是一对多的关系。您可以通过PublisherId表中的Books来实现此目的。

答案 2 :(得分:2)

MySQL中的外键约束名具有全局可见性,因此应该是唯一的。所以最好采用像fk_ [table name] _ [field name]

这样的命名模式

答案 3 :(得分:1)

尝试这个Alter声明,

alter table publisher add constraint 
ISBN_publisher foreign key (ISBN) references book (ISBN);

答案 4 :(得分:0)

您很可能已在数据库中使用名称ISBN的约束。如果是这样,只需重命名约束。

试试这个

  

alter table publisher添加约束P_ISBN外键(ISBN)   参考书(ISBN);

答案 5 :(得分:0)

除了其他答案之外,如果其他答案没有成功 - 请检查您的约束是否足够短。

示例:我收到了以下错误:

fk_test_group_has_test_group1`
fk_test_group_has_test_header1

但不是这些(我缩短了名字):

fk_test_group_has_group1`
fk_test_group_has_header1

答案 6 :(得分:0)

我认为这个信息可能与更具相关性有关。它与命名空间无关。