2009-04-09 29 views

cevap

669

documentation göre,

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

Eh, bu doğru, ama belgelere göre, CREATE TABLE bir şey (column1 PRIMARY KEY, column2 PRIMARY KEY); de mümkün olmalı, ama değil. – Yar

+4

@Yar Dokümanlar, "Tek bir CREATE TABLE ifadesinde birden fazla PRIMARY KEY deyim varsa, bu bir hatadır." Evet, demiryolu diyagramları da geçerli olduğunu gösterebilir, ancak aşağıdaki metin açıklığa kavuşmamıştır. –

+3

Bu yanıtta olduğu gibi * PRIMARY KEY (column1, column2) * kısmını eklemeyi unutmayın. Column2 tanımından sonra eklemeyi denerseniz, bir ** sözdizimi hatası ** alırsınız. – vovahost

36

Evet var. Ancak, bu birincil anahtarın her iki sütunda da NULL değerine birden çok kez izin verdiğini unutmayın.

gibi bir tablo oluşturun: Bu olmayan bir standarttır (

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 
+0

Bu davranışların nedenine dair bir referans var mı? Veritabanında birkaç satır atmak ve yine de 'NULL' içeriyor olsalar bile kopyaları çıkarmanın iyi bir yolu ne olurdu? – Pastafarianist

+1

@Pastafarianist http://www.sqlite.org/lang_createtable.html - "SQL standardına göre, PRIMARY KEY her zaman NULL DEĞİLDİR.Ne yazık ki, bazı erken sürümlerde bir hata nedeniyle, bu SQLite'de durum böyle değil. [...] NULL değerleri diğer NULL'lar da dahil olmak üzere diğer tüm değerlerden ayrı sayılır. " –

+0

Evet, SQL NULL'larda her zaman false karşılaştırır. Bu nedenle, ilişkisel teori, NULL'yi, herhangi bir anahtar bileşenin değeri olarak özel olarak hariç tutar. , ilişkisel bir uygulamadır.Yazarlar, çoklu ama "eşit" olmayan anahtarlara pragmatik olarak izin vermeyi tercih ediyorlar.Nedenleri NULL'lara anahtar değerler olarak izin vermemek için tercih edilir. – holdenweb

144
CREATE TABLE something (
    column1 INTEGER NOT NULL, 
    column2 INTEGER NOT NULL, 
    value, 
    PRIMARY KEY (column1, column2) 
); 
+0

Birincil Anahtar, NOT NULL değil midir? – pratnala

+18

@pratnala Standart SQL'de Evet, SQLite'de 'NULL', birincil anahtarlara izin verilir.Bu cevap, daha standart davranışlar istiyorsanız, 'NOT NULL' öğesini eklemeniz gerektiğini vurgular. Cevabım, çok sütunlu için sadece çok basit bir sözdizimi birincil anahtar. –

13

Birincil anahtar alanları boş değil olarak ilan edilmelidir:

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

Şimdi bu herhangi bir uyarı olmadan çalışır Birincil anahtarın tanımı, benzersiz olması ve null olmamasıdır). Fakat aşağıda, herhangi bir DBMS'deki tüm çok sütunlu birincil anahtarlar için iyi bir uygulamadır.

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

SQLite sürümü 3.8.2 beri açık NOT NULL şartnameye alternatif "OLMADAN ROWID" özelliğidir: [1]

NOT NULL is enforced on every column of the PRIMARY KEY 
in a WITHOUT ROWID table. 
tablolar potansiyel verimlilik avantajları vardır "ROWID OLMADAN", için göz önünde bulundurmak daha az ayrıntılı bir alternatiftir: Örneğin

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

, sqlite3 isteminde: Sütunlarınızın yabancı diğer tabloları tuşları (sık karşılaşılan durum) varsa

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

: 0

25

Temel başka şekilde

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 
); 
İlgili konular