SQLITE içindeki 1'den fazla sütunda birincil anahtar belirtme sözdizimi nedir?
SQLITE içindeki 1'den fazla sütunda birincil anahtar belirtme sözdizimi nedir?
Yanıtlar:
Belgelere göre ,
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY ( column1, column2)
);
NULL
birincil anahtarlarda izin verilir. Bu cevap, daha standart davranışlar istiyorsanız, NOT NULL
kendinizi eklemeniz gerektiğini vurgulamaktadır . Cevabım, çok sütunlu birincil anahtarın temel sözdizimidir.
Evet. Ancak, bu tür birincil anahtarın NULL
her iki sütundaki değerlere birden çok kez izin verdiğini unutmayın .
Aşağıdaki gibi bir tablo oluşturun:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Şimdi bu herhangi bir uyarı olmadan çalışı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
NULL
?
Temel:
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Sütunlarınız diğer tabloların yabancı anahtarlarıysa (genel durum):
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
);
Birincil anahtar alanları null değil olarak bildirilmelidir (birincil anahtarın tanımı benzersiz olması ve null olmaması gerektiğinden standart değildir). Ancak 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)
)
;
SQLite 3.8.2 sürümünden beri, açık NOT NULL belirtimlerine bir alternatif "WITH ROWID" belirtimi: [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
"ROWID OLMADAN" tablolar potansiyel verimlilik avantajlarına sahiptir, bu nedenle dikkate alınması gereken daha az ayrıntılı bir alternatif:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Örneğin, sqlite3 komut isteminde:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
ek etkileri vardır ve NOT NULL
birincil anahtarınızın yanında yazmaya alternatif olarak kullanılmamalıdır .
Başka bir şekilde, iki sütun birincil anahtarını unique
ve otomatik artış tuşunu da yapabilirsiniz primary
. Tıpkı bunun gibi: https://stackoverflow.com/a/6157337
Aşağıdaki kod, SQLite içinde birincil anahtar olarak 2 sütunlu bir tablo oluşturur .
ÇÖZÜM:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))