서점 데이터베이스를 구현하려고합니다. 나는 테이블
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
- 답변 # 2
데이터 구조가 이상합니다.
Books
에 대한 엔티티 테이블이 있어야합니다.Authors
및Publishers
. 이들은 기본 키 및 추가 정보로 자동 증가 된 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);
관련 자료
- sql - MySQL에서는 소수점 두 자리이지만 SELECT라는 단어에 오류가 표시됩니다
- swift - 서비스의 데이터를 텍스트 필드에 쓰고 싶지만 오류가 나타납니다! UITextFieldtext는 주 스레드에서만 사용해야합니다
- python - Mysql, discordpy를 사용할 때 MariaDB에 대한 오류
- c++ - 동일한 데이터베이스에 두 개의 연결을 만들 때 "mysql server has gone away"오류가 발생합니다
- c++ - foreach 루프에 '&'를 쓰지 않으면 왜 오류가 발생합니까?
- c# - Hangfire 오류 중복 (1406-CurrentCulture)
- 파일의 다른 줄과 중복되는 줄에 일부 데이터가있는 줄을 제거하는 PHP 스크립트를 작성하는 방법 텍스트 파일의 각 줄이 콜론으로 구분되는 경우
- ubuntu19.10 - mysql 오류 - 13 (권한 거부 됨)
- java - 스프링 부트 애플리케이션에서 로컬 MySQL 데이터베이스에 연결하는 동안 오류가 발생했습니다
- php - MySQL에 데이터를 삽입 할 때 쿼리 오류가 발생합니다
- linux - mysql이 시작되지 않습니다오류 - su : 경고 : 디렉토리를/nonexistent로 변경할 수 없음 : 해당 파일 또는 디렉토리가 없습니다
- Ubuntu ubuntu20.04.1 LTS - ubuntu 20041 lts - mysql 오류 :구성되지 않은/종속성 오류
- sql - 참조 및 외래 키에 대해 mySQL에서 오류 발생
- javascript - 노드 indexjs를 작성하려고했는데 오류가 발생했습니다
- typescript - Angular 프로젝트 빌드 오류 "중복 식별자 'IteratorResult'"
- sql - mySQL 그룹이없는 중복 값에서 MAX (날짜)를 선택하는 방법
- python - MySQL이 acuñar를 acunar의 중복 항목으로 등록하는 이유는 무엇입니까?
- java - 오류 코드 - 1062 update를 사용하는 키 고유 데이터 필드에 대한 중복 항목 ' mysql
- sql - 하위 쿼리에서 쿼리의 열을 사용할 때 MySQL 오류
- Java를 MySql에 연결할 수없는 이유는 무엇입니까 (연결 오류)?
- PHP에서 PDO를 사용하여 테이블에 배열을 삽입하는 방법
- 여러 IN &AND 문이 있는 mysql where 절을 최적화하는 더 좋은 방법이 있습니까?
- mysql : 동일한 테이블의 항목에 대한 둘 사이의 관계 생성
- mysql : Mariadb -필드에 null 값이 없는 경우에도 "필드 'xxx'에 기본값이 없습니다" 오류가 발생함
- PHP를 사용하여 동일한 SQL 테이블에서 두 번 선택
- mysql 텍스트 쿼리에서 특정 레code 필터링
- 하나의 PHP 파일에서 여러 쿼리 사용 이전 쿼리의 결과 집합
- mysql : insert 문을 사용하여 부모 테이블의 자식 테이블에 외래 키 값을 추가하거나 삽입하는 방법
- 중첩 객체의 여러 인수에 대한 MySQL JSON_SEARCH
- mysql : 두 열을 곱하고 데이터베이스에 새 열을 추가하는 방법은 무엇입니까?
당신은
duplicate key error
를 받고있다 이미ISBN
라는 제약 조건이 있기 때문에 첫 번째alter
당 데이터베이스에 존재author
에 진술 표Publisher
에서 다른 이름으로 제약 조건을 사용해보십시오 표