我要实现一个书店数据库。我创建了表格book
,author
和publisher
。我想做出以下两种关系。
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'
原来,外键不能指定两次?怎么了?提前谢谢。
答案 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)
您的数据结构很奇怪。您应该拥有Books
,Authors
和Publishers
的实体表。这些将具有自动递增的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)
我认为这个信息可能与更具相关性有关。它与命名空间无关。