sourcecode

MySQL "ERROR 1005 (HY000)" :'foo' 테이블을 만들 수 없습니다.#sql-12c_4' (오류번호: 150)

copyscript 2022. 9. 17. 09:52
반응형

MySQL "ERROR 1005 (HY000)" :'foo' 테이블을 만들 수 없습니다.#sql-12c_4' (오류번호: 150)

에 몇 하는 작업을 하고 있었습니다.foo하지만 매번 외부 키에 관한 에러 번호 150이 표시됩니다.먼저, 테이블을 작성하기 위한 코드를 다음에 나타냅니다.

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

표시되는 에러는 다음과 같습니다.

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

SHOW ENGINE INNODB STATUS이치노

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

Stack Overflow 등 온라인 검색에서 이 오류를 해결하는 방법에 대한 조언이 담긴 유용한 블로그 게시물을 발견했습니다.하지만 무엇이 잘못되었는지 알 수 없습니다.어떤 도움이라도 주시면 감사하겠습니다!

자동차에서는 car_id를 기본 키로 만들어야 합니다.

주의: 같은 문제가 있었습니다.이것은 참조필드가 2개의 다른 테이블에서 다른 조합에 있었기 때문입니다(동일한 타입이었습니다).

참조되는 모든 필드에 동일한 유형과 데이터 정렬이 있는지 확인하십시오.

양쪽 테이블의 엔진이 동일한지 확인합니다.예를 들어 다음과 같습니다.

CREATE Table FOO ();

또, 다음과 같이 합니다.

CREATE Table BAR () ENGINE=INNODB;

테이블 BAR에서 테이블 FOO로 제약조건을 작성하려고 하면 특정 MySQL 버전에서 작동하지 않습니다.

다음과 같이 문제를 해결합니다.

CREATE Table FOO () ENGINE=INNODB;

미묘하지만 이 오류는 참조된 기존 테이블인 "smallint unsigned"와 일치하도록 작은 int 열을 부호 없음으로 선언하는 것을 잊어버렸기 때문에 발생합니다.서명되지 않은 키와 서명되지 않은 키가 하나씩 있으면 MySQL이 새 테이블에 외부 키가 생성되지 않습니다.

id smallint(3) not null

일치하지 않습니다. 외부 키를 위해

id smallint(3) unsigned not null

이 전혀 쓸모없는 정보를 얻을 수 없는 오류는 다음과 같습니다.

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

문제는 코멘트 테이블에 있습니다.user_id는 다음과 같이 정의되어 있습니다.

`user_id` int(10) unsigned NOT NULL

그래서 제 경우 NOT NULL과 ON DELETE SET NULL의 경합이 문제였습니다.

또한 두 테이블 모두 동일한 문자 집합을 가져야 합니다.

예를 들어,

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

로.

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

문자 집합이 다르기 때문에 실패합니다.이것은 mysql이 같은 오류를 반환하는 또 다른 미묘한 오류입니다.

저는 Ubuntu linux를 사용하고 있는데, 제 경우 잘못된 문 구문에 의해 에러가 발생했습니다(단말기에 perror 150을 입력함으로써 알 수 있습니다).

MySQL 오류 코드 150: 외부 키 제약 조건이 잘못 형성되었습니다.

쿼리 구문 변경:

alter table scale add constraint foreign key (year_id) references year.id;

로.

alter table scale add constraint foreign key (year_id) references year(id);

고치다.

참조되는 필드는 참조되는 테이블의 "Key"여야 하며 반드시 기본 키가 아니어야 합니다.따라서 "car_id"는 기본 키이거나 "Cars" 테이블에서 NOT NULL 및 UNIQURE 제약 조건으로 정의해야 합니다.

또한 두 필드 모두 동일한 유형과 조합이어야 합니다.

또한 데이터베이스 전체(800MB까지)를 Import하려고 할 때 제약 오류 및 MySQL 연결 및 연결 해제와 함께 이 오류(여러 테이블)가 발생했습니다.MySQL 서버의 최대 허용 패킷 수가 너무 낮아서 문제가 발생했습니다.(Mac에서) 이 문제를 해결하려면:

  • /private/etc/my.conf를 열었다.
  • # MySQL 서버에서 변경됨max_allowed_packet1M에서 4M(이 값을 사용하여 실험해야 할 수도 있습니다.)
  • MySQL 재부팅

그 후 데이터베이스를 성공적으로 가져왔습니다.

Mac OS X(x86 64비트)용 MySQL 5.5.12를 실행하고 있습니다.

참조하고 있는 필드가 외부 키와 정확히 일치하는지 확인합니다.내 경우 하나는 서명되지 않았고 다른 하나는 서명되어 있기 때문에 일치하도록 변경했을 뿐이고, 이것은 작동했습니다.

ALTER TABLE customer_information 추가 제약 fk_customer_information 1 외부 키(user_id) 레퍼런스users(id) 업데이트 캐스케이드 삭제 시

해결:

Primary_Key와 Foreign_Key가 데이터 유형과 정확히 일치하는지 확인합니다.서명되지 않은 다른 서명에 서명하면 실패합니다.둘 다 서명되지 않은 것을 확인하는 것이 좋습니다.

중복된 외부 키 이름을 사용하고 있었습니다.

FK 이름을 바꾸자 문제가 해결되었다.

설명:

두 테이블 모두 PK1, FK1 등으로 불리는 제약이 있었습니다.이름을 바꾸거나 고유한 이름을 만들면 문제가 해결되었습니다.

참조되는 열은 단일 열 또는 다중 열 인덱스의 첫 번째 열 인덱스여야 하며 동일한 유형 및 데이터 정렬이 필요합니다.

내 두 테이블은 대조법이 다르다.다음과 같은 show table status를 발행하여 표시할 수 있습니다.table_name대조는 다른 표를 발행하여 변경할 수 있습니다.table_name문자 집합 utf8로 변환합니다.

문제를 해결해서 공유하고 싶었어요.

다음 오류가 발생하였습니다.< >문제의 내용은 다음과 같습니다.

alter table system_registro_de_modificacion 삭제 제한 시 외부 키(usuariomodificador_id) REFERENCEs Usuario(id) 추가;

Windows WAMP 에서는 동작하고 있습니다만, Linux MySQL 에서는, CASE 에서는 보다 엄격하기 때문에, 「Usuario」(정확한 케이스)가 아닌 「Usuario」라고 쓰면, 에러가 발생해, 케이스를 간단하게 변경해 버렸습니다.

언급URL : https://stackoverflow.com/questions/2799021/mysql-error-1005-hy000-cant-create-table-foo-sql-12c-4-errno-150

반응형