기존 테이블에 외부 키 추가
"카탈로그" 테이블에 외부 키를 추가하고 싶습니다.
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
이렇게 하면 다음 오류 메시지가 나타납니다.
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
INNODB 상태 오류:
120405 14:02:57 테이블 mytable의 외부 키 제약에 오류가 있습니다.#sql-7fb1_7d3a:
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
이 쿼리를 사용하면 동작하지만 "삭제 시" 액션이 잘못되어 있습니다.
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
두 테이블 모두 InnoDB이며 두 필드 모두 "INT(11) not null"입니다.MySQL 5.1.61을 사용하고 있습니다.MacBook Pro에서 MySQL Workbench(최신)를 사용하여 이 ALTER 쿼리를 실행하려고 합니다.
표 작성문:
CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$
CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Bezeichnung` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
외부 키(grade_id)를 기존 테이블(사용자)에 추가하려면 다음 절차를 수행합니다.
ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
이 쿼리를 사용하면 시나리오대로 시도했는데 잘 작동합니다.
ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`);
간단한 단계...
ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)
이 링크를 체크합니다.에러 번호 150 에 도움이 되었습니다.http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
내 머리 위에는 두 가지가 떠오른다.
- 외부 키 인덱스는 전체 데이터베이스에서 고유한 이름입니까(목록의 #3)?
- 업데이트 시 테이블 PK를 NULL로 설정하시겠습니까(목록의 #5)?
업데이트 시 설정된 NULL이 문제인 것 같습니다(오늘따라 머리가 거꾸로 돌아가지 않으면...).
편집: 원래 게시글의 댓글을 놓쳤습니다.서명되지 않은/부호되지 않은 int 열을 사용하면 문제가 해결될 수 있습니다.제 링크가 미래에 누군가 생각하는 데 도움이 되었으면 좋겠어요.
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
그러나 테이블에는 다음이 있습니다.
CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL,
NOT NULL로 정의되어 있으므로 Sprache 열을 NULL로 설정할 수 없습니다.
수정 방법Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.
표를 변경하고 색인을 추가합니다.
ALTER TABLE users ADD INDEX index_name (index_column)
이제 구속조건을 추가합니다.
ALTER TABLE foreign_key_table ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column) REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION ON UPDATE CASCADE;
인덱스를 추가하지 않으면 작동하지 않습니다.
약 6시간 동안 싸운 후에 나는 해결책을 생각해냈다. 나는 이것이 영혼을 구하기를 바란다.
MySQL은 다음 쿼리를 실행합니다.
ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
건배!
ALTER TABLE을 사용하여 테이블에 외부 키 제약 조건을 추가할 경우 먼저 필요한 인덱스를 생성해야 합니다.
- 인덱스 생성
- 테이블 변경
한 번의 질문으로 모든 것을 시도하다
ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0,
ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
순서 1: 이 스크립트를 실행합니다.
SET FOREIGN_KEY_CHECKS=0;
스텝 2: 컬럼 추가
ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL
스텝 3: 추가된 컬럼에 외부 키 추가
ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);
순서 4: 이 스크립트를 실행합니다.
SET FOREIGN_KEY_CHECKS=1;
이것은 기본적으로 테이블이 2개의 다른 문자 집합으로 구성되어 있기 때문에 발생합니다.예를 들어 charset=utf-8로 작성된 테이블과 CHARSET=latin1로 작성된 다른 테이블이 있기 때문에 이러한 테이블에 foregn 키를 추가할 수 있습니다.두 테이블에서 동일한 문자 집합을 사용하면 위조 키를 추가할 수 있습니다.에러 1005 forign 키 제약이 잘못 형성되어 있는 경우, 이것으로 해결할 수 있습니다.
외부 키 제약 조건은 참조 테이블 및 열의 기본 키와 동일한 데이터 형식이어야 합니다.
ALTER TABLE child_table_name ADD FOREIGN KEY (child_table_column) REFERENCES parent_table_name(parent_table_column);
child_table_name은 구속조건을 추가하는 테이블입니다.child_table_column은 외부 키를 추가하는 테이블 컬럼입니다.부모 테이블은 참조하는 테이블입니다.parent_table_column은 참조하는 부모 테이블의 열 이름입니다.
ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)
예:-
ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)
나도 같은 문제를 겪었어내 경우 테이블에는 이미 데이터가 있고 이 테이블에는 참조 테이블에 존재하지 않는 키가 있습니다.그래서 나는 제약조건을 무시한 이 행을 삭제해야만 했고 모든 것이 작동했다.
「」가 다음의 를 재차 합니다.engine
★★★★★★★★★★★★★★★★★」charset
두 테이블 모두 동일합니다.
그렇지 않으면 이 오류가 표시됩니다.
언급URL : https://stackoverflow.com/questions/10028214/add-foreign-key-to-existing-table
'programing' 카테고리의 다른 글
SQL: "X가 있는 모든 행 또는 없는 경우 Y가 있는 모든 행"을 얻기 위한 단일 쿼리가 있습니까? (0) | 2023.01.03 |
---|---|
Enum의 values() 메서드에 대한 문서는 어디에 있습니까? (0) | 2023.01.03 |
Python의 Generators와 Iterators의 차이점 (0) | 2023.01.03 |
재정의 메서드가 재정의 메서드보다 더 넓은 예외를 발생시킬 수 없는 이유는 무엇입니까? (0) | 2023.01.03 |
jQuery Data vs Attr? (0) | 2023.01.03 |