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_packet
1M에서 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
'sourcecode' 카테고리의 다른 글
Java에서 대소문자를 구분하지 않는 리터럴 서브스트링을 교체하는 방법 (0) | 2022.09.17 |
---|---|
작업 작성자의 Redx 상태에 액세스하시겠습니까? (0) | 2022.09.17 |
Java 또는 C#에서의 예외 관리 베스트 프랙티스 (0) | 2022.09.17 |
UNIX 소켓 파일용 mysqld_safe 디렉토리 '/var/run/mysqld'가 없습니다. (0) | 2022.09.17 |
Java 웹 응용 프로그램에 사용하는 아키텍처에 대해 설명하십시오. (0) | 2022.09.17 |