ไวยากรณ์สำหรับการระบุคีย์หลักในคอลัมน์มากกว่า 1 คอลัมน์ใน SQLITE คืออะไร
ไวยากรณ์สำหรับการระบุคีย์หลักในคอลัมน์มากกว่า 1 คอลัมน์ใน SQLITE คืออะไร
คำตอบ:
ตามเอกสารประกอบนั้น
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
อนุญาตให้ใช้ในคีย์หลัก คำตอบนี้เน้นว่าหากคุณต้องการพฤติกรรมมาตรฐานมากขึ้นคุณต้องเพิ่มNOT NULL
ตัวเอง คำตอบของฉันเป็นเพียงไวยากรณ์พื้นฐานที่สำคัญสำหรับคีย์หลักหลายคอลัมน์
ใช่. แต่โปรดจำไว้ว่าคีย์หลักดังกล่าวอนุญาตให้มีNULL
ค่าในทั้งสองคอลัมน์หลายครั้ง
สร้างตารางเช่น:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
ตอนนี้ใช้ได้โดยไม่มีการเตือนล่วงหน้า:
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
?
ขั้นพื้นฐาน :
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
หากคอลัมน์ของคุณเป็นรหัสต่างประเทศของตารางอื่น ๆ (กรณีทั่วไป):
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
);
เขตข้อมูลคีย์หลักควรประกาศเป็นไม่เป็นโมฆะ (นี่ไม่ใช่มาตรฐานตามคำจำกัดความของคีย์หลักคือต้องไม่ซ้ำกันและไม่เป็นค่าว่าง) แต่ด้านล่างเป็นแนวปฏิบัติที่ดีสำหรับคีย์หลักหลายคอลัมน์ใน DBMS ใด ๆ
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
ตั้งแต่เวอร์ชัน 3.8.2 ของ SQLite ทางเลือกอื่นสำหรับข้อมูลจำเพาะ NOT NULL ที่ชัดเจนคือข้อกำหนด "โดยไม่ต้องรอ": [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
ตาราง "โดยไม่ต้องรอ" มีข้อได้เปรียบด้านประสิทธิภาพที่อาจเกิดขึ้นดังนั้นทางเลือกที่ละเอียดน้อยกว่าในการพิจารณาคือ:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
ตัวอย่างเช่นที่พรอมต์ sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
มีความหมายเพิ่มเติมและไม่ควรใช้เป็นทางเลือกในการเขียนNOT NULL
ถัดจากคีย์หลักของคุณ
ในอีกทางหนึ่งนอกจากนี้คุณยังสามารถทำให้สองคอลัมน์คีย์หลัก unique
และเพิ่มโดยอัตโนมัติprimary
ที่สำคัญ แบบนี้: https://stackoverflow.com/a/6157337
PRIMARY KEY (id, name)
ไม่ได้ผลสำหรับฉัน การเพิ่มข้อ จำกัด ทำงานแทน
CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))
รหัสต่อไปนี้สร้างตารางที่มี2 คอลัมน์เป็นคีย์หลักใน SQLite
สารละลาย:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))