[SQL] 외래 키 테이블 열은 NULL이 될 수 있습니까?
SQL외래 키 테이블 열은 NULL이 될 수 있습니까?
나는 다른 테이블에 여러 ID 열이있는 테이블이있다.
나는 거기에 데이터를 입력하는 경우에만 힘 무결성 외래 키를 원한다. 내가 그 열을 채우는 데 나중에 업데이 트를 할 경우, 그것은 또한 제약 조건을 확인해야합니다.
(이것은 내가 MySQL을 & InnoDB의 테이블 유형 사용하고 가능성이 데이터베이스 서버에 따라 다릅니다)
나는 이것이 합리적인 기대이라고 생각하지만, 만약 내가 잘못 정정 해줘.
해결법
-
==============================
1.값이 NULL이 아닌 경우에만 예, 제약 조건을 적용 할 수 있습니다. 이것은 쉽게 다음 예제를 테스트 할 수 있습니다 :
값이 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`))
우리는 PARENT_ID에 NULL을 삽입하기 때문에 첫 번째 삽입 전달합니다. 우리는 부모 테이블에 존재하지 않는 값을 삽입하려 이후 두 번째 삽입 때문에 외래 키 제약 조건 실패합니다.
-
==============================
2.나는 (빈 문자열 반대), 그렇지 않으면 내가 제약 조건 위반 오류를 얻을 것, 삽입 할 때, 널 열 값은 특별히 NULL로 선언했다는 것을 발견했다.
나는 (빈 문자열 반대), 그렇지 않으면 내가 제약 조건 위반 오류를 얻을 것, 삽입 할 때, 널 열 값은 특별히 NULL로 선언했다는 것을 발견했다.
-
==============================
3.그래, 당신이 그것을 예상대로 작동합니다. 불행하게도, 나는 MySQL의 매뉴얼이의 명시 문을 찾기 위해 문제가 될 것으로 보인다.
그래, 당신이 그것을 예상대로 작동합니다. 불행하게도, 나는 MySQL의 매뉴얼이의 명시 문을 찾기 위해 문제가 될 것으로 보인다.
외부 키는 값이 다른 테이블에 있어야 의미한다. NULL은 NULL에 열을 설정할 때, 그것은 그에 제약 조건을 적용하려고 이해가되지 것, 가치의 부재를 의미한다.
-
==============================
4.이 있지만, 위의 작품은하지 않습니다. DELETE CASCADE ON을 참고
이 있지만, 위의 작품은하지 않습니다. DELETE CASCADE ON을 참고
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)
-
==============================
5.이 주위에 또 다른 방법은 다른 테이블의 기본 요소를 삽입하는 것입니다. 예를 들어, 다른 테이블에 UUID = 00000000-0000-0000-0000-000000000000에 대한 참조는 아무런 조치를 표시하지 않을 것이다. 당신은 또한 ID가 "중립"이 될 수 있도록, 예를 들어, 모든 값을 설정해야 0, 빈 문자열, 순서는 null 코드 로직에 영향을 미치지합니다.
이 주위에 또 다른 방법은 다른 테이블의 기본 요소를 삽입하는 것입니다. 예를 들어, 다른 테이블에 UUID = 00000000-0000-0000-0000-000000000000에 대한 참조는 아무런 조치를 표시하지 않을 것이다. 당신은 또한 ID가 "중립"이 될 수 있도록, 예를 들어, 모든 값을 설정해야 0, 빈 문자열, 순서는 null 코드 로직에 영향을 미치지합니다.
-
==============================
6.예, 값이 NULL이 될 수 있지만, 당신은 명시해야합니다. 나는 전에이 같은 상황을 경험하고 수행해야 할 일을 기억하기 위해 조금 걸립니다 그래서이 일이 왜 잊지 쉽게합니다.
예, 값이 NULL이 될 수 있지만, 당신은 명시해야합니다. 나는 전에이 같은 상황을 경험하고 수행해야 할 일을 기억하기 위해 조금 걸립니다 그래서이 일이 왜 잊지 쉽게합니다.
제출 된 데이터 캐스트 또는 빈 문자열로 해석하면 실패합니다. 그러나 명시 적으로 삽입 할 때 NULL에 값을 설정하거나 업데이트하여, 넌 좋은 이동합니다.
하지만이 프로그램의 재미는, 그렇지? 우리 자신의 문제를 생성 한 다음 고정! 건배!
-
==============================
7.나는 또한이 문제에 붙어. 하지만 부호없는 정수로 외부 키를 정의하여 간단하게 해결했다. 예 - 아래 찾기
나는 또한이 문제에 붙어. 하지만 부호없는 정수로 외부 키를 정의하여 간단하게 해결했다. 예 - 아래 찾기
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;
from https://stackoverflow.com/questions/2366854/can-table-columns-with-a-foreign-key-be-null by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] (가) SQL 또는 MySQL의에서 키워드 조인을 사용하지 않는 조인이 뭔가 잘못인가? (0) | 2020.03.30 |
---|---|
[SQL] 열 이름을 탈출 SQL 표준? (0) | 2020.03.30 |
[SQL] SQL 서버 체크 대소 문자 구분? (0) | 2020.03.30 |
[SQL] SQL에 의해 고유의 레코드를 선택하는 방법 (0) | 2020.03.30 |
[SQL] SQL Server 2008의 "WHERE"절에서 "CASE"문 (0) | 2020.03.30 |