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
Trả lời
Theo documentation, nó
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
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
@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à. –
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
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
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
@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. " –
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
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY (column1, column2)
);
Không phải khóa chính áp đặt NOT NULL? – pratnala
@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. –
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)
)
;
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
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
);
Bằng cách khác, bạn cũng có thể làm cho hai cột chính quan trọngunique
và tự động tăng tự động tăng khóa primary
. Chỉ cần như thế này: https://stackoverflow.com/a/6157337
- 1. GreenDAO - khóa chính trên nhiều cột
- 2. Khóa chính nhiều cột trong MySQL 5
- 3. SQLite: group_concat() nhiều cột
- 4. SQLite: autoincrement câu hỏi khóa chính
- 5. Tại sao sử dụng nhiều cột làm khóa chính (khóa chính kết hợp)
- 6. h2 sql, tạo bảng có khóa chính nhiều cột?
- 7. Là chỉ mục cần thiết cho khóa chính trong SQLite?
- 8. Ràng buộc bảng SQLite - duy nhất trên nhiều cột
- 9. Nhập csv vào sqlite với autoincrementing khóa chính
- 10. Khóa nước ngoài đề cập đến các khóa chính trên nhiều bảng?
- 11. ScalaQuery nhiều khóa chính và khóa ngoài
- 12. Khóa chính hai cột trong MySQL
- 13. Cách tạo khóa tổng hợp trên nhiều cột
- 14. Khóa ngoài nhiều cột trong MySQL?
- 15. Cách lấy cột khóa chính trong Oracle?
- 16. Thêm cột khóa chính trong bảng SQL
- 17. Thay đổi khóa chính của một bảng trong SQLite
- 18. ngăn chặn autoincrementing số nguyên khóa chính?
- 19. Cập nhật khóa trùng lặp - Nhiều cột
- 20. Trong PetaPoco, làm thế nào để trang trí một bảng có nhiều cột khóa chính
- 21. Một đến nhiều liên kết - Tham gia các bảng có cột khóa không chính trong JPA
- 22. Khóa chính dựa trên năm?
- 23. Đặt cột làm khóa chính nếu bảng không có khóa chính
- 24. Nhiều khóa tmux tiền tố chính?
- 25. Một hoặc hai khóa chính trong bảng nhiều người?
- 26. Khuôn khổ thực thể Nhiều cột dưới dạng khóa chính bằng thông thạo Api
- 27. sqlalchemy ORM: cách khai báo một lớp bảng có chứa khóa chính nhiều cột?
- 28. sqlite: Tôi có nên sử dụng cột văn bản làm khóa chính hay chuyển đổi nó bằng hàm băm không?
- 29. đánh dấu cột hiện tại làm khóa chính trong datatable
- 30. Khóa ngoại SQLite?
Điều này còn được gọi là khóa phức hợp http://en.wikipedia.org/wiki/Compound_key – OneWorld
@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