MySQL: ОШИБКА 1022 (23000): Не удается написать; дублирующий ключ в таблице '# sql-2b8_2'

Я собираюсь реализовать базу данных в книжном магазине. Я создал таблицу 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 выполняет последний оператор alter, я получаю эту ошибку.

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

Изначально, нельзя ли назначать второй ключ два раза? Что случилось? Заранее благодарю вас.

Ответ 1

Вы получаете duplicate key error, потому что уже существует ограничение с именем ISBN, присутствующее в базе данных в вашем первом операторе alter, на author table

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

Ответ 2

Ваша структура данных странная. У вас должны быть таблицы сущностей для Books, Authors и Publishers. Они будут иметь автоматически увеличивающиеся идентификаторы в качестве первичных ключей и дополнительную информацию. Например, книги имеют номера "титры" и "isbn". У авторов есть имена. У издателей есть имена и адреса.

Затем вам нужны таблицы соединений. Таким образом, книги имеют один или несколько авторов (игнорируя "редакторы", которые составляют главы других авторов), и авторы могут писать одну или несколько книг. Это предлагает таблицу BookAuthors с одной строкой на книгу и на автора в книге.

У книг обычно есть один издатель, так что это отношения "один ко многим". Вы можете реализовать это, указав PublisherId в таблице Books.

Ответ 3

Внешний ключ. Названия ограничений в MySQL имеют глобальную видимость и, следовательно, должны быть уникальными. Поэтому лучше использовать шаблон именования, например fk_ [имя таблицы] _ [имя поля]

Ответ 4

попробуйте этот оператор Alter,

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

Ответ 5

Скорее всего, у вас уже есть ограничение с именем ISBN в вашей базе данных. Просто переименуйте ограничения, если это так.

Попробуйте это

alter table publisher добавить ограничение P_ISBN внешний ключ (ISBN) справочная книга (ISBN);

Ответ 6

Как дополнение к другим ответам, если другие ответы не заставляют его работать, убедитесь, что ваше ограничение достаточно короткое.

Пример: Я получаю сообщение об ошибке:

fk_test_group_has_test_group1`
fk_test_group_has_test_header1

но не с этими (я сократил имена):

fk_test_group_has_group1`
fk_test_group_has_header1