외부 키(MySQL) 추가 방법
저는 SQL을 아주 처음 접해서 간단한 ALTER TABLE을 수행하여 새 열을 만들고 이를 외부 키로 사용하여 데이터베이스의 다른 간단한 테이블을 참조하려고 합니다.두 테이블 모두 InnoDB로 변경했습니다.
하지만 ALTER TABLE 코드를 실행할 때 다음과 같은 오류가 발생합니다.
Error 1452 Cannot add or update a child row:
a foreign key constraint fails (`toys`.<result 2 when
explaining filename '#sql-6d4_6'>, CONSTRAINT
`#sql-6d4_6_ibfk_1` FOREIGN KEY (`toy_id`) REFERENCES `toys` (`toy_id`))
다음은 두 표의 DESC입니다.
표 1:
FIELD TYPE NULL KEY EXTRA
toy_id int(11) NO PRI auto_increment
toy varchar(50) YES
표 2:
FIELD TYPE NULL KEY EXTRA
boy_id int(11) NO PRI auto_increment
boy varchar(50) YES
이것이 제가 수행하려던 ALTER 쿼리입니다.
ALTER TABLE boys
ADD COLUMN toy_id INT NOT NULL,
ADD CONSTRAINT toys_toy_id_fk
FOREIGN KEY(toy_id)
REFERENCES toys(toy_id);
나는 그것을 알아내려고 사방을 둘러봤지만, 운이 없었습니다.미리 고마워요, 그리고 이 신입에게 친절하게 대해주세요 :)
편집:
다음은 두 테이블에 대한 SHOW CREATE TABLE입니다.
표 1:
CREATE TABLE `toys` (
`toy_id` int(11) NOT NULL AUTO_INCREMENT,
`toy` varchar(50) DEFAULT NULL,
PRIMARY KEY (`toy_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
표 2:
CREATE TABLE `boys` (
`boy_id` int(11) NOT NULL AUTO_INCREMENT,
`boy` varchar(50) DEFAULT NULL,
PRIMARY KEY (`boy_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
NOT NULL 열은 상위 테이블의 값과 일치하는 값으로 제한되지만 DEFAULT가 없는 새 비채움 열이므로 NULL 값만 가질 경우 행이 0보다 많은 테이블에 NOT NULL 열을 추가할 수 없습니다.
해결 방법은 단계적으로 수행하는 것입니다. 열을 추가하되 NOT NULL로 선언하지 말고, 아직 외래 키를 선언하지 마십시오.
ALTER TABLE boys
ADD COLUMN toy_id INT;
그런 다음 장난감 표의 값과 일치하는 유효한 데이터로 채웁니다.
UPDATE boys SET toy_id = ...;
그런 다음 열을 NOT NULL로 변경하고 제약 조건을 만듭니다.
ALTER TABLE boys MODIFY COLUMN toy_id INT NOT NULL,
ADD CONSTRAINT toys_toy_id_fk
FOREIGN KEY(toy_id)
REFERENCES toys(toy_id);
언급URL : https://stackoverflow.com/questions/15349382/how-to-add-foreign-key-mysql
'programing' 카테고리의 다른 글
ipv4 범위 필터링 시 SQL 성능 (0) | 2023.10.07 |
---|---|
python에서 여러 sql 문을 실행할 수 있는 방법을 제안하시겠습니까? (0) | 2023.10.07 |
memcpy의 내부 구현은 어떻게 이루어집니까? (0) | 2023.10.07 |
@Html은 어떻습니까?Microsoft ASP에서 BeginForm() work?와 검색 결과를 입력합니다.순 MVC 5 튜토리얼? (0) | 2023.10.07 |
식별 관계와 비식별 관계의 차이점은 무엇입니까? (0) | 2023.10.02 |