복붙노트

[SQL] 외래 키 테이블 열은 NULL이 될 수 있습니까?

SQL

외래 키 테이블 열은 NULL이 될 수 있습니까?

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

나는 거기에 데이터를 입력하는 경우에만 힘 무결성 외래 키를 원한다. 내가 그 열을 채우는 데 나중에 업데이 트를 할 경우, 그것은 또한 제약 조건을 확인해야합니다.

(이것은 내가 MySQL을 & InnoDB의 테이블 유형 사용하고 가능성이 데이터베이스 서버에 따라 다릅니다)

나는 이것이 합리적인 기대이라고 생각하지만, 만약 내가 잘못 정정 해줘.

해결법

  1. ==============================

    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. ==============================

    2.나는 (빈 문자열 반대), 그렇지 않으면 내가 제약 조건 위반 오류를 얻을 것, 삽입 할 때, 널 열 값은 특별히 NULL로 선언했다는 것을 발견했다.

    나는 (빈 문자열 반대), 그렇지 않으면 내가 제약 조건 위반 오류를 얻을 것, 삽입 할 때, 널 열 값은 특별히 NULL로 선언했다는 것을 발견했다.

  3. ==============================

    3.그래, 당신이 그것을 예상대로 작동합니다. 불행하게도, 나는 MySQL의 매뉴얼이의 명시 문을 찾기 위해 문제가 될 것으로 보인다.

    그래, 당신이 그것을 예상대로 작동합니다. 불행하게도, 나는 MySQL의 매뉴얼이의 명시 문을 찾기 위해 문제가 될 것으로 보인다.

    외부 키는 값이 다른 테이블에 있어야 의미한다. NULL은 NULL에 열을 설정할 때, 그것은 그에 제약 조건을 적용하려고 이해가되지 것, 가치의 부재를 의미한다.

  4. ==============================

    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. ==============================

    5.이 주위에 또 다른 방법은 다른 테이블의 기본 요소를 삽입하는 것입니다. 예를 들어, 다른 테이블에 UUID = 00000000-0000-0000-0000-000000000000에 대한 참조는 아무런 조치를 표시하지 않을 것이다. 당신은 또한 ID가 "중립"이 될 수 있도록, 예를 들어, 모든 값을 설정해야 0, 빈 문자열, 순서는 null 코드 로직에 영향을 미치지합니다.

    이 주위에 또 다른 방법은 다른 테이블의 기본 요소를 삽입하는 것입니다. 예를 들어, 다른 테이블에 UUID = 00000000-0000-0000-0000-000000000000에 대한 참조는 아무런 조치를 표시하지 않을 것이다. 당신은 또한 ID가 "중립"이 될 수 있도록, 예를 들어, 모든 값을 설정해야 0, 빈 문자열, 순서는 null 코드 로직에 영향을 미치지합니다.

  6. ==============================

    6.예, 값이 NULL이 될 수 있지만, 당신은 명시해야합니다. 나는 전에이 같은 상황을 경험하고 수행해야 할 일을 기억하기 위해 조금 걸립니다 그래서이 일이 왜 잊지 쉽게합니다.

    예, 값이 NULL이 될 수 있지만, 당신은 명시해야합니다. 나는 전에이 같은 상황을 경험하고 수행해야 할 일을 기억하기 위해 조금 걸립니다 그래서이 일이 왜 잊지 쉽게합니다.

    제출 된 데이터 캐스트 또는 빈 문자열로 해석하면 실패합니다. 그러나 명시 적으로 삽입 할 때 NULL에 값을 설정하거나 업데이트하여, 넌 좋은 이동합니다.

    하지만이 프로그램의 재미는, 그렇지? 우리 자신의 문제를 생성 한 다음 고정! 건배!

  7. ==============================

    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;
    
  8. from https://stackoverflow.com/questions/2366854/can-table-columns-with-a-foreign-key-be-null by cc-by-sa and MIT license