IT이야기

다중 열 기본 키의 NULL 값

cyworld 2021. 9. 26. 11:32
반응형

다중 열 기본 키의 NULL 값


기본 키를 구성하는 여러 열이 있는 테이블이 있습니다. 저장된 데이터의 특성으로 인해 이러한 필드 중 일부는 NULL을 가질 수 있습니다. 나는 내 테이블을 다음과 같이 디자인했습니다.

CREATE TABLE `test` (
    `Field1` SMALLINT(5) UNSIGNED NOT NULL,
    `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`Field1`, `Field2`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;

그러나 실행 describe test하면 다음과 같이 표시됩니다.

|| *Field* || *Type*                || *Null* || *Key* || *Default* || *Extra* 
|| Field1  || smallint(5) unsigned  || NO     || PRI   ||           ||         
|| Field2  || decimal(5,2) unsigned || NO     || PRI   || 0.00      ||         

그리고 NULL값을 삽입할 때 계속 오류가 발생 합니다.

'Field2' 열은 null일 수 없습니다.

기본 키의 일부인 필드가 null일 수 없기 때문입니까? 예를 들어 '0'을 사용하는 것 외에 대안은 무엇입니까 NULL?


MySQL 문서에서 :

PRIMARY KEY는 모든 키 열이 NOT NULL로 정의되어야 하는 고유 인덱스입니다.
명시적으로 NOT NULL로 선언되지 않은 경우 MySQL은 이를 암시적으로(그리고 자동으로) 선언합니다. 테이블에는 하나의 PRIMARY KEY만 있을 수 있습니다. PRIMARY KEY의 이름은 항상 PRIMARY이므로 다른 종류의 인덱스 이름으로 사용할 수 없습니다.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Field2가 NULL일 수 있는 경우 Field1이 모든 행에서 구별되어야 하기 때문에 기본 키의 일부로 이를 필요로 하는 이유가 무엇인지 궁금합니다. 따라서 Field1 자체가 기본 키로 충분해야 합니다. Field2에 다른 유형의 인덱스를 만들 수 있습니다.


기본 키는 열을 고유하고 null이 아닌 것으로 만드는 데 사용됩니다.

null 값을 삽입하려면 field2를 고유 하게 만듭니다.

고유 제약 조건은 필드에서 중복을 제거하지만 null 값을 허용 합니다.


기본 키는 열에 NULL값이 없어야 함을 나타냅니다 . 따라서 복합 기본 키를 정의하는 데 사용되는 열은 NULL.

또한 Oracle 서버는 복합 기본 키 정의에 사용된 모든 열의 조합을 비교합니다. 모든 열의 기존 데이터(예: x,y)가 새로 추가된 행과 일치하면 Unique Constraint Violated 오류가 발생합니다.

게다가, 이 스레드를 보세요. 복합 기본 키의 nullable 열에 무슨 문제가 있습니까? .

이 링크는 복합 키에서 NULLABLE 열의 가능성에 대한 귀중한 정보를 제공합니다!


고유 키를 사용할 수 있습니다. 이 링크를 살펴보세요. null 값으로 작동합니다.

http://www.xaprb.com/blog/2009/09/12/the-difference-between-a-unique-index-and-primary-key-in-mysql/


다음과 같이 고유 키를 사용할 수 있습니다.

mysql> CREATE TABLE `test` (
    ->     `Field1` SMALLINT(5) UNSIGNED NOT NULL,
    ->     `Field2` DECIMAL(5,2) UNSIGNED NULL DEFAULT NULL,
    ->     UNIQUE KEY (`Field1`, `Field2`)
    -> )
    -> COLLATE='latin1_swedish_ci'
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.03 sec)

mysql> 
mysql> desc test
    -> ;
+--------+-----------------------+------+-----+---------+-------+
| Field  | Type                  | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| Field1 | smallint(5) unsigned  | NO   | MUL | NULL    |       |
| Field2 | decimal(5,2) unsigned | YES  |     | NULL    |       |
+--------+-----------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

ReferenceURL : https://stackoverflow.com/questions/11001333/null-value-in-multi-column-primary-key

반응형