Cú pháp để chỉ định khóa chính trên nhiều hơn 1 cột trong SQLITE là gì?
Cú pháp để chỉ định khóa chính trên nhiều hơn 1 cột trong SQLITE là gì?
Câu trả lời:
Theo tài liệu , nó
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
được phép trong các khóa chính. Câu trả lời này nhấn mạnh rằng nếu bạn muốn hành vi chuẩn hơn, bạn cần thêm NOT NULL
chính mình. Câu trả lời của tôi chỉ là cú pháp rất cơ bản cho khóa chính nhiều cột.
Đúng. Nhưng hãy nhớ rằng khóa chính như vậy cho phép NULL
các giá trị trong cả hai cột nhiều lần.
Tạo một bảng như vậy:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Bây giờ điều này hoạt động mà không có bất kỳ cảnh báo:
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
?
Căn bản :
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Nếu các cột của bạn là khóa ngoại của các bảng khác (trường hợp phổ biến):
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
);
Các trường khóa chính phải được khai báo là không null (đây không phải là tiêu chuẩn vì định nghĩa của khóa chính là nó phải là duy nhất và không phải là null). Nhưng dưới đây là một cách thực hành tốt cho tất cả các khóa chính nhiều cột trong bất kỳ DBMS nào.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Kể từ phiên bản 3.8.2 của SQLite, một thay thế cho thông số kỹ thuật KHÔNG NULL rõ ràng là thông số kỹ thuật "KHÔNG CÓ ROWID": [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
Các bảng "KHÔNG CÓ ROWID" có lợi thế hiệu quả tiềm năng, do đó, một giải pháp thay thế ít dài hơn để xem xét là:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Ví dụ: tại dấu nhắc sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
có ý nghĩa bổ sung, và nó không nên được sử dụng như là một thay thế cho việc viết NOT NULL
bên cạnh khóa chính của bạn.
Theo một cách khác, bạn cũng có thể tạo khóa chính hai cột unique
và khóa tăng tự độngprimary
. Chỉ như thế này: https://stackoverflow.com/a/6157337
Đoạn mã sau tạo một bảng có 2 cột làm khóa chính trong SQLite.
GIẢI PHÁP:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))