>

서점 데이터베이스를 구현하려고합니다. 나는 테이블 book 를 만들었습니다 authorpublisher . 다음 두 가지 관계를 맺고 싶습니다.

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 에 진술  표

    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 에 대한 엔티티 테이블이 있어야합니다. AuthorsPublishers . 이들은 기본 키 및 추가 정보로 자동 증가 된 ID를가집니다. 예를 들어, 책에는 "제목"과 "isbn"번호가 있습니다. 저자는 이름이 있습니다. 출판사에는 이름과 주소가 있습니다.

    그러면 접합 테이블이 필요합니다. 따라서 책에는 하나 이상의 저자가 있으며 (다른 저자의 챕터를 편집하는 "편집자"무시) 저자는 하나 이상의 책을 쓸 수 있습니다. 이것은 BookAuthors 를 제안합니다  표, 책 및 책의 저자 당 한 행씩.

    책은 일반적으로 출판인이 한 명이므로 일대 다 관계입니다. PublisherId 를 사용하여이를 구현할 수 있습니다.   Books 에서  MySQL의 외래 키제약 이름은 전 세계에 공개되어 있으므로 고유해야합니다. fk_ [table name] _ [field name]

  • 답변 # 3

    이 Alter 문을 사용해보십시오.

    와 같은 이름 지정 패턴을 채택하는 것이 좋습니다.

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

  • 답변 # 4

    데이터베이스에 이름이 ISBN 인 제약 조건이 이미있을 가능성이 높습니다. 그렇다면 제약 조건의 이름을 바꾸십시오.

    이것을 시도하십시오

    와이즈 비즈

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

관련 자료

  • 이전 oop - 수업이 무엇인지 제대로 이해하고 있습니까?
  • 다음 c++ - 이동 생성자의 초기화 목록에서 std - : move를 사용해야하는 이유는 무엇입니까?