المفتاح الأساسي Sqlite على أعمدة متعددة




primary-key ddl (5)

أساسي:

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
);

ما هو بناء الجملة لتحديد مفتاح أساسي في أكثر من عمود واحد في SQLITE؟


منذ الإصدار 3.8.2 من SQLite ، هو بديل عن مواصفات NOT NULL صريحة مواصفات "بدون ROWID": [ 1 ]

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

تحتوي جداول "بدون ROWID" على مزايا كفاءة محتملة ، لذا يكون بديل أقل مطولاً للنظر هو:

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 sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2


وبطريقة أخرى ، يمكنك أيضًا جعل المفتاح الأولي للعمودين unique ومفتاح المفتاح التلقائي للزيادة الإضافية . مثل هذا: https://.com/a/6157337


وفقا documentation ، هو

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)
);




composite-primary-key