여러 열의 Sqlite 기본 키


답변:


805

에 따르면 문서 , 그건

CREATE TABLE something (
  column1, 
  column2, 
  column3, 
  PRIMARY KEY (column1, column2)
);

3
글쎄, 이것은 맞지만 문서에 따르면 CREATE TABLE something (column1 PRIMARY KEY, column2 PRIMARY KEY); 가능해야하지만 그렇지 않습니다.
Yar

6
@Yar 문서에 "하나의 CREATE TABLE 문에 둘 이상의 PRIMARY KEY 절이 있으면 오류입니다."라고 말합니다. 예, 철도도는 그것이 유효하다는 것을 나타낼 수 있지만, 아래의 텍스트는 그것이 유효하지 않다는 것을 분명히합니다.
Brian Campbell

10
이 답변과 같이 PRIMARY KEY (column1, column2) 부분을 ​​끝에 추가해야합니다 . column2 정의 후에 추가하려고하면 구문 오류가 발생 합니다.
vovahost

159
CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);

기본 키가 NOT NULL을 부과하지 않습니까?
pratnala

23
@pratnala 표준 SQL에서 그렇습니다. SQLite에서는 NULL기본 키에서 허용됩니다. 이 답변은보다 표준적인 행동을 원한다면 NOT NULL스스로 를 추가해야한다는 것을 강조합니다 . 내 대답은 다중 열 기본 키의 매우 기본적인 구문입니다.
Brian Campbell

42

예. 그러나 이러한 기본 키는NULL 는 두 열의 값을 여러 번 합니다.

다음과 같이 테이블을 작성하십시오.

    sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));

이제 이것은 경고없이 작동합니다.

sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> select * from something;
NULL|NULL|bla-bla
NULL|NULL|bla-bla

그러한 행동의 이유에 대한 언급이 있습니까? 데이터베이스에 여러 행을 덤프하고 여전히 중복을 제거하는 좋은 방법은 무엇입니까 NULL?
Pastafarianist

4
@Pastafarianist sqlite.org/lang_createtable.html- "SQL 표준에 따라 PRIMARY KEY는 항상 NOT NULL을 암시해야합니다. 불행히도 일부 초기 버전의 버그로 인해 SQLite에서는 그렇지 않습니다. [...] NULL 값은 다른 NULL을 포함한 다른 모든 값과 다른 것으로 간주됩니다. "
놀라운 1 월

예, SQL NULL에서는 항상 false를 비교합니다. 이 때문에 관계 이론은 키 구성 요소의 값으로 NULL을 제외시킵니다. 그러나 SQLite는 관계형 관행입니다. 저자는 "동일한"키가 아닌 여러 개의 키를 실용적으로 허용 한 것으로 보입니다. 분명히 NULL을 키 값으로 허용하지 않는 것이 좋습니다.
holdenweb

31

기본 :

CREATE TABLE table1 (
    columnA INTEGER NOT NULL,
    columnB INTEGER NOT NULL,
    PRIMARY KEY (columnA, columnB)
);

열이 다른 테이블의 외래 키인 경우 (일반적인 경우) :

CREATE TABLE table1 (
    table2_id INTEGER NOT NULL,
    table3_id INTEGER NOT NULL,
    FOREIGN KEY (table2_id) REFERENCES table2(id),
    FOREIGN KEY (table3_id) REFERENCES table3(id),
    PRIMARY KEY (table2_id, table3_id)
);

CREATE TABLE table2 (
    id INTEGER NOT NULL,
    PRIMARY KEY id
);

CREATE TABLE table3 (
    id INTEGER NOT NULL,
    PRIMARY KEY id
);

14

기본 키 필드는 널이 아닌 것으로 선언해야합니다 (기본 키의 정의는 널이 아닌 고유해야함에 따라 표준이 아님). 그러나 아래는 모든 DBMS의 모든 다중 열 기본 키에 대한 모범 사례입니다.

create table foo
(
  fooint integer not null
  ,foobar string not null
  ,fooval real
  ,primary key (fooint, foobar)
)
;

11

SQLite 버전 3.8.2부터 명시적인 NOT NULL 스펙의 대안은 "WITHOUT ROWID"스펙입니다. [ 1 ]

NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.

"ROWTHOUT ROWID"테이블은 잠재적 인 효율성 이점을 가지므로 고려할 덜 장황한 대안은 다음과 같습니다.

CREATE TABLE t (
  c1, 
  c2, 
  c3, 
  PRIMARY KEY (c1, c2)
 ) WITHOUT ROWID;

예를 들어, sqlite3 프롬프트에서 : sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2


요즘 읽는 사람 WITHOUT ROWID에게는 추가적인 의미가 있으며 NOT NULL기본 키 옆에 쓰는 대신 사용할 수 없습니다 .
shadowtalker


2

PRIMARY KEY (id, name)나를 위해 작동하지 않았다. 제약 조건을 추가하면 작업이 대신 수행되었습니다.

CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))


1

다음 코드 는 기본 키로 2 개의 열 이있는 테이블을 만듭니다. 는 SQLite에서 .

해결책:

CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.