INSERT INTO xxx (col) SELECT ...
을 실행할 때 NOT NULL 외래 키를 무시하고 MySQL 5.6 InnoDb에 문제가 있습니다. 다른 형식으로 insert 문을 실행하면 제약 조건이 올바르게 적용됩니다. 외래 키 검사가 가능하고, sql_mode = STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION
MySQL Insert Select가 NOT NULL 제약 조건을 적용하지 않음
다음은 예입니다 :
CREATE TABLE Test_Parent
(
id BIGINT(18) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
dummy VARCHAR(255)
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci
COMMENT 'Test parent table';
CREATE TABLE Test_Child
(
id BIGINT(18) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,
fid BIGINT UNSIGNED NOT NULL,
FOREIGN KEY Fk_Test_Parent_01(fid) REFERENCES Test_Parent(id)
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci
COMMENT 'Test child table';
INSERT INTO Test_Parent(dummy)
VALUES ('test');
## Here's where the FK constraint should be enforced but isn't ##
INSERT INTO Test_Child(fid)
SELECT id
FROM Test_Parent
WHERE dummy = 'missing value';
1 row affected in 5ms
## Running an insert with a different format, the constraint is enforced ##
INSERT INTO Test_Child(fid)
VALUES (null);
Column 'fid' cannot be null
## Running this format, the foreign key is also enforced ##
INSERT INTO Test_Child(id, fid)
VALUES (123, (SELECT id FROM Test_Parent WHERE dummy = 'missing value'));
Column 'fid' cannot be null
MySQL은 3 삽입 문에서 2 외래 키를 적용 할 이유가 이해가 안 돼요. 어떤 아이디어?
그 때문에 INSERT ... SELECT는'WHERE' 절이 일치하지 않기 때문에 실제로 어떤 행 삽입도 일어나지 않습니다. 두 테이블 모두에서'SELECT *'를 선택하면'Test_Child'에 행이 없습니다 ... http : //sqlfiddle.com/#! 9/7413e0/1 –
실제 데이터와 유즈 케이스가 테스트 세트는 우리를 위해 설정합니다. –
맞습니다. 삽입 된 것으로 1 행을보고하지만 실제로 테이블에 아무 것도 삽입되지 않았습니다. 이 시나리오에서는'NOT NULL' 제약 조건이 적용될 것으로 기대합니다. 대신, 마치 예외를 삼킨 것입니다. – adam