2009-04-09 45 views
522

Cú pháp để chỉ định khóa chính trên nhiều hơn 1 cột trong SQLITE là gì?Khóa chính Sqlite trên nhiều cột

+9

Điều này còn được gọi là khóa phức hợp http://en.wikipedia.org/wiki/Compound_key – OneWorld

+1

@OneWorld Hoặc khóa tổng hợp, nếu bất kỳ cột nào không phải là chính khóa. – Michael

Trả lời

669

Theo documentation, nó

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

Vâng, điều này là đúng, nhưng theo tài liệu, CREATE TABLE một cái gì đó (cột1 PRIMARY KEY, column2 PRIMARY KEY); nên có thể là tốt, nhưng nó không phải là. – Yar

+4

@Yar Các tài liệu nói "Nếu có nhiều hơn một mệnh đề PRIMARY KEY trong một câu lệnh CREATE TABLE, thì đó là một lỗi". Có, các biểu đồ đường sắt có thể cho biết rằng đó là hợp lệ là tốt, nhưng văn bản dưới đây làm rõ rằng nó không phải là. –

+3

Hãy nhớ thêm * PRIMARY KEY (cột1, cột2) * một phần vào cuối như trong câu trả lời này. Nếu bạn cố gắng thêm nó sau định nghĩa column2, bạn sẽ nhận được một lỗi cú pháp **. – vovahost

36

Yes. Nhưng hãy nhớ rằng khóa chính như vậy cho phép các giá trị NULL 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ờ làm việc này 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 
+0

Có bất kỳ tham chiếu nào về lý do của hành vi đó không? Điều gì sẽ là một cách tốt để đổ một số hàng trong cơ sở dữ liệu và vẫn loại bỏ các bản sao, ngay cả khi chúng chứa 'NULL'? – Pastafarianist

+1

@Pastafarianist http://www.sqlite.org/lang_createtable.html - "Theo tiêu chuẩn SQL, PRIMARY KEY phải luôn ngụ ý NOT NULL.Thật không may, do một lỗi trong một số phiên bản đầu, đây không phải là trường hợp trong SQLite. [...] Các giá trị NULL được xem là khác biệt với tất cả các giá trị khác, bao gồm cả các giá trị NULL khác. " –

+0

Có, trong SQL NULL luôn luôn so sánh sai. Vì lý do này, lý thuyết quan hệ đặc biệt loại trừ NULL như giá trị của bất kỳ thành phần quan trọng nào. Có vẻ như các tác giả đã chọn thực tế cho phép các khóa nhiều nhưng không phải là "bằng nhau". Rõ ràng là không nên cho phép NULL làm giá trị khóa. – holdenweb

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

Không phải khóa chính áp đặt NOT NULL? – pratnala

+18

@pratnala Trong SQL chuẩn Trong SQLite, 'NULL' được cho 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 có hành vi tiêu chuẩn hơn, bạn cần thêm chính' NOT NULL'. Câu trả lời của tôi chỉ là cú pháp rất cơ bản cho một cột đa cột. khóa chính. –

13

tiểu lĩnh vực then chốt cần được khai báo là không null (đây là không chuẩn làm Định nghĩa của khóa chính là nó phải là duy nhất và không phải là rỗng). Nhưng dưới đây là một 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) 
) 
; 
6

Kể từ phiên bản 3.8.2 của SQLite, một thay thế cho rõ ràng chi tiết kỹ thuật NOT NULL là "KHÔNG ROWID" đặc điểm kỹ thuật: [1]

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

"KHÔNG ROWID" bảng có ưu điểm hiệu quả tiềm năng, do đó, một thay thế ít tiết để 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

25

cơ 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à chìa khóa nước 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 vấn đề liên quan