source

10.4.24-MariaDB - 외부 키 구속조건이 잘못 형성됨

manycodes 2023. 6. 15. 21:58
반응형

10.4.24-MariaDB - 외부 키 구속조건이 잘못 형성됨

person_addresses테이블 오류가 발생하고 있습니다.Foreign key constraint is incorrectly formed내 버전은10.4.24-MariaDB

CREATE TABLE persons (
  person_id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  email varchar(50) DEFAULT NULL,
  phone int(11) DEFAULT NULL,
  bio text DEFAULT NULL,
  dob date DEFAULT NULL,
  gender enum('Male','Female','Other') NOT NULL,
  status tinyint(4) NOT NULL,
  created_at timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (person_id),
  UNIQUE KEY email (email),
  UNIQUE KEY phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE person_addresses (
  person_id int(11) NOT NULL ,
  address text NOT NULL,
  created_at timestamp NOT NULL DEFAULT current_timestamp(),
  UNIQUE KEY uc_person_address (person_id,address),
  CONSTRAINT fk_person FOREIGN KEY (person_id) REFERENCES persons(person_id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

더 자세한 오류

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2023-01-11 12:41:52 0x421c Error in foreign key constraint of table `test`.`person_addresses`:
There is no index in table ```test``.``person_addresses``` where the columns appear
as the first columns. Constraint:
 FOREIGN KEY (person_id) REFERENCES persons (person_id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Please refer to https://mariadb.com/kb/en/library/foreign-keys/ for correct foreign key definition.Create  table `test`.`person_addresses` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' FOREIGN KEY (person_id) REFERENCES persons (person_id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4'.

MariaDB: https://jira.mariadb.org/browse/MDEV-29717 에서 일치하는 버그 보고서를 찾은 것 같습니다.

문제는 외부 키에 필요한 인덱스가 매우 크면 인덱스가 자동으로 생성된다는 것입니다.그러나 해당 인덱스가 스토리지 엔진의 인덱스 크기 제한보다 클 경우(사용 중인 MariaDB 버전에서는 기본적으로 innodb_large_message=on인 DYNAMIC 행 형식이므로 3072바이트여야 함) 실패합니다.text인덱스의 유형이 너무 커서 인덱스 접두사를 정의하지 않고 인덱싱할 수 없습니다.그러나 외부 키는 인덱스 접두사로 정의된 인덱스를 사용할 수 없습니다.

안타깝게도 외부 키는 스토리지 엔진 깊숙한 곳에서 구현되기 때문에 더 많은 정보를 제공하는 오류 메시지가 나타날 기회가 거의 없습니다.이 문제는 플러그형 스토리지 엔진 구현과 관련된 문제입니다.

당신의 경우의 해결책은 다음과 같은 것을 바꾸는 것이어야 합니다.address열 유형.그럴 리 없다.text그것은 오직 a일 수 있습니다.varchar인덱스 접두사 길이 제한에 대해 너무 길지 않습니다.

예를 들어 MariaDB 10.4를 사용하여 테스트했습니다.https://dbfiddle.uk/5jTX8iFt 다음과 같은 경우 실패합니다.address이라text그리고 그것은 잘 작동하면 됩니다.address이라varchar(255)다른 길이는 테스트하지 않았습니다, 그것은 당신에게 맡기겠습니다.

당신이 필요할 것 같지는 않습니다.text어쨌든 주소는.64KB가 필요한 주소를 가진 사람이 있습니까?

언급URL : https://stackoverflow.com/questions/75079218/10-4-24-mariadb-foreign-key-constraint-is-incorrectly-formed

반응형