Apa sintaksis untuk menentukan kunci primer pada lebih dari 1 kolom dalam SQLITE?
Apa sintaksis untuk menentukan kunci primer pada lebih dari 1 kolom dalam SQLITE?
Jawaban:
Menurut dokumentasi , itu
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
diizinkan di kunci utama. Jawaban ini menekankan bahwa jika Anda menginginkan perilaku yang lebih standar, Anda perlu menambahkan NOT NULL
diri Anda sendiri. Jawaban saya hanyalah sintaks yang sangat mendasar untuk kunci primer multi-kolom.
Iya. Tetapi ingat bahwa kunci utama tersebut memungkinkan NULL
nilai di kedua kolom beberapa kali.
Buat tabel seperti itu:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Sekarang ini berfungsi tanpa peringatan:
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
?
Dasar:
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Jika kolom Anda adalah kunci asing dari tabel lain (kasus umum):
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
);
Bidang kunci primer harus dinyatakan sebagai bukan nol (ini bukan standar karena definisi kunci primer adalah bahwa ia harus unik dan bukan nol). Tetapi di bawah ini adalah praktik yang baik untuk semua kunci utama multi-kolom dalam DBMS apa pun.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Sejak versi 3.8.2 dari SQLite, sebuah alternatif untuk spesifikasi NOT NOT NULL adalah spesifikasi "TANPA ROWID": [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
Tabel "TANPA ROWID" memiliki potensi keuntungan efisiensi, jadi alternatif yang kurang tepat untuk dipertimbangkan adalah:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Misalnya, pada prompt sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
memiliki implikasi tambahan, dan itu tidak boleh digunakan sebagai alternatif untuk menulis di NOT NULL
sebelah kunci utama Anda.
Dalam cara lain, Anda juga dapat membuat dua kolom kunci utama unique
dan auto-increment kunci primary
. Sama seperti ini: https://stackoverflow.com/a/6157337
Kode berikut membuat tabel dengan 2 kolom sebagai kunci utama dalam SQLite.
LARUTAN:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))