IT story

외래 키가있는 테이블 열이 NULL 일 수 있습니까?

hot-time 2020. 5. 10. 10:24
반응형

외래 키가있는 테이블 열이 NULL 일 수 있습니까?


다른 테이블에 여러 ID 열이있는 테이블이 있습니다.

거기에 데이터를 넣을 때만 외래 키가 무결성을 유지하기를 원합니다 . 나중에 해당 열을 채우려면 업데이트를 수행하면 제약 조건도 확인해야합니다.

(이것은 데이터베이스 서버에 따라 다를 수 있습니다 .MySQL & InnoDB 테이블 유형을 사용하고 있습니다)

나는 이것이 합리적인 기대라고 생각하지만 내가 틀렸다면 나를 바로 잡으십시오.


예, 값이 NULL이 아닌 경우에만 제한 조건을 적용 할 수 있습니다. 다음 예제를 통해 쉽게 테스트 할 수 있습니다.

CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                    parent_id INT NULL,
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)


INSERT INTO child (id, parent_id) VALUES (2, 1);

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
-- (`parent_id`) REFERENCES `parent` (`id`))

첫 번째 삽입은에 NULL을 삽입하기 때문에 전달됩니다 parent_id. parent테이블에 존재하지 않는 값을 삽입하려고했기 때문에 외래 키 제약 조건으로 인해 두 번째 삽입에 실패했습니다 .


삽입 할 때 null 열 값을 구체적으로 NULL로 선언해야한다는 것을 알았습니다. 그렇지 않으면 빈 문자열이 아닌 제약 조건 위반 오류가 발생합니다.


예, 예상대로 작동합니다. 불행히도, MySQL 매뉴얼 에서 이것에 대한 명시 적 진술을 찾는 데 어려움을 겪고있는 것 같습니다 .

외래 키는 다른 테이블에 값이 있어야 함을 의미합니다. NULL 은 값이 없음을 나타내므로 열을 NULL로 설정하면 제약 조건을 적용하려고하는 것은 의미가 없습니다.


위의 작동하지만 작동하지 않습니다. ON DELETE CASCADE 참고

CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                 PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                parent_id INT NULL,
                FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE

) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)

Another way around this would be to insert a DEFAULT element in the other table. For example, any reference to uuid=00000000-0000-0000-0000-000000000000 on the other table would indicate no action. You also need to set all the values for that id to be "neutral", e.g. 0, empty string, null in order to not affect your code logic.


I also stuck on this issue. But I solved simply by defining the foreign key as unsigned integer. Find the below example-

CREATE TABLE parent (
   id int(10) UNSIGNED NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id int(10) UNSIGNED NOT NULL,
    parent_id int(10) UNSIGNED DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

Yes, the value can be NULL, but you must be explicit. I have experienced this same situation before, and it's easy to forget WHY this happens, and so it takes a little bit to remember what needs to be done.

If the data submitted is cast or interpreted as an empty string, it will fail. However, by explicitly setting the value to NULL when INSERTING or UPDATING, you're good to go.

But this is the fun of programming, isn't it? Creating our own problems and then fixing them! Cheers!

참고URL : https://stackoverflow.com/questions/2366854/can-table-columns-with-a-foreign-key-be-null

반응형