programing

기존 테이블에 외부 키 추가

goodsources 2023. 1. 3. 21:47
반응형

기존 테이블에 외부 키 추가

"카탈로그" 테이블에 외부 키를 추가하고 싶습니다.

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.

  1. 표를 변경하고 색인을 추가합니다.

    ALTER TABLE users ADD INDEX index_name (index_column)
    
  2. 이제 구속조건을 추가합니다.

    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을 사용하여 테이블에 외부 키 제약 조건을 추가할 경우 먼저 필요한 인덱스를 생성해야 합니다.

  1. 인덱스 생성
  2. 테이블 변경

한 번의 질문으로 모든 것을 시도하다

  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

반응형