Ответ 1
Согласно документации, это
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
Каков синтаксис для указания первичного ключа на более чем 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
в обоих столбцах несколько раз.
Создайте таблицу как таковую:
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
Основные:
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
);
Поля первичного ключа должны быть объявлены как не равные нулю (это не стандартно, как определение первичного ключа состоит в том, что он должен быть уникальным, а не null). Но ниже это хорошая практика для все первичные ключи с несколькими столбцами в любой СУБД.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Начиная с версии 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
По-другому вы также можете сделать первичный ключ двух столбцов unique
и клавишу автоматического увеличения primary
. Точно так же: fooobar.com/questions/14593/...
Следующий код создает таблицу с 2 столбцами в качестве первичного ключа в SQLite.
РЕШЕНИЕ:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
PRIMARY KEY (id, name)
не работал для меня. Добавление ограничения сделало работу за меня.
CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))