Sqlite первичный ключ на нескольких столбцах - PullRequest
568 голосов
/ 09 апреля 2009

Каков синтаксис для указания первичного ключа для более чем одного столбца в SQLITE?

Ответы [ 9 ]

738 голосов
/ 09 апреля 2009

Согласно документации , это

CREATE TABLE something (
  column1, 
  column2, 
  column3, 
  PRIMARY KEY (column1, column2)
);
152 голосов
/ 19 февраля 2011
CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);
40 голосов
/ 10 сентября 2010

Да. Но помните, что такой первичный ключ допускает значения 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
26 голосов
/ 19 ноября 2015

Basic:

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
);
14 голосов
/ 17 октября 2012

Поля первичного ключа должны быть объявлены как не нулевые (это не является стандартным как определение из первичного ключа является то, что он должен быть уникальным и не нулевым). Но ниже это хорошая практика для все первичные ключи нескольких столбцов в любой СУБД.

create table foo
(
  fooint integer not null
  ,foobar string not null
  ,fooval real
  ,primary key (fooint, foobar)
)
;
8 голосов
/ 02 ноября 2015

Начиная с версии 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

2 голосов
/ 16 мая 2017

По-другому, вы также можете сделать первичный ключ с двумя столбцами unique и автоинкремент ключ primary. Просто так: https://stackoverflow.com/a/6157337

1 голос
/ 16 октября 2018

Следующий код создает таблицу с 2 столбцом в качестве первичного ключа в SQLite.

РЕШЕНИЕ:

CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
0 голосов
/ 12 декабря 2018

PRIMARY KEY (id, name) не работает для меня. Добавление ограничения сделало эту работу за меня.

CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))

...