mysql 错误1022(23000):不能写;表“#sql-2b8_2”中的键重复

snvhrwxg  于 2022-10-31  发布在  Mysql
关注(0)|答案(8)|浏览(142)

我将实现一个书店数据库。我已经创建了表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'

原来,外键不能指定两次吗?有什么不好?提前谢谢。

o3imoua4

o3imoua41#

您将获得duplicate key error,因为根据对author表的第一条alter语句,数据库中已经存在名为ISBN的约束

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);
hsgswve4

hsgswve42#

您的数据结构很奇怪。您应该有BooksAuthorsPublishers的实体表。这些实体表应该有自动递增的ID作为主键和附加信息。例如,书籍有“标题”和“isbn”编号。作者有姓名。出版商有姓名和地址。
然后需要连接表。因此,书籍有一个或多个作者(忽略编译其他作者的章节的“编辑器”),作者可以写一本或多本书。这建议使用BookAuthors表,每本书和书中的每一个作者都有一行。
图书通常有一个出版商,因此这是一对多关系。您可以通过在Books表中设置PublisherId来实现这一点。

zfycwa2u

zfycwa2u3#

MySQL中的外键 * 约束名 * 具有全局可见性,因此应该是唯一的。因此最好采用fk_[表名]_[字段名]这样的命名模式

vhmi4jdf

vhmi4jdf4#

请尝试以下Alter语句,

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

aamkag615#

作为对其他答案的补充,如果其他答案不起作用-检查您的约束是否足够短。

**示例:**使用以下内容时出现错误:

fk_test_group_has_test_group1`
fk_test_group_has_test_header1

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

fk_test_group_has_group1`
fk_test_group_has_header1
xeufq47z

xeufq47z6#

很可能您的数据库中已经有一个名为ISBN的约束。如果是这样,只需重命名约束即可。
试试这个
更改表出版商添加约束P_ISBN外键(ISBN)引用图书(ISBN);

uxh89sit

uxh89sit7#

我认为这条消息可以做得更相关。它与命名空间无关。

kwvwclae

kwvwclae8#

要添加到@ randomity answer,您可以看到数据库中所有索引的列表,如下所示:

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

它可以帮助您了解该索引已经存在于哪个表中

相关问题