SQLite multi-Primary Key на таблице, один из которых - Auto Increment
У меня есть несколько (составных) первичных ключей на таблице, и один из них будет автоматически увеличиваться. Однако, интересно, SQLite позволяет использовать ключевое слово AUTOINCREMENT
сразу после обязательного ключевого слова PRIMARY KEY
.
Мой запрос:
CREATE TABLE ticket (
id INTEGER PRIMARY KEY AUTOINCREMENT,
seat TEXT, payment INTEGER,
PRIMARY KEY (id, seat))
Однако ошибка в table "ticket" has more than one primary key
.
На самом деле я могу избежать других первичных ключей для этой таблицы. Но я кодирую структуру ORM (черт возьми, я сумасшедший) и не хочу изменять структуру генерации ограничения PRIMARY KEY
для таблицы (потому что она разрешена в MySQL afaik).
Любые решения?
Ответы
Ответ 1
Нет, я не думаю, что это возможно.
Вы можете создать UNIQUE INDEX
, который имеет тот же эффект, что и PRIMARY KEY:
CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");
Кроме того, я не вижу логики вашей схемы, то есть → если столбец является автоинкрементным, и вы не собираетесь связываться со значениями вручную, он будет уникальным в любом случае, поэтому он делает хороший простой короткий первичный ключ. Почему композит? Однако у вас могут быть веские причины сделать еще один указатель на комбинацию столбцов.
Ответ 2
UNIQUE INDEX
не имеет такого же эффекта, как PRIMARY KEY
. Уникальный индекс даст NULL; ограничение первичного ключа не будет. Вам лучше объявить обе эти ограничения.
CREATE TABLE ticket (
id INTEGER PRIMARY KEY AUTOINCREMENT,
seat TEXT NOT NULL,
payment INTEGER,
UNIQUE (id, seat));
Вы также должны много думать о том, действительно ли вам нужно принимать платежи NULL.
Ответ 3
Вы также можете написать вот так:
CREATE TABLE ticket (
id INTEGER PRIMARY,
seat TEXT, payment INTEGER,
PRIMARY KEY (id, seat))
Ответ 4
Удивительно, но я смог реализовать автоматическое приращение для SqLite с составными ключами с синтаксисом точно так же с SQL Server:
Используйте IDENTITY (1,1)
create table [dbo].[Person]
{
ID int IDENTITY (1,1) not null,
CompositeID1 int not null,
CompositeID2 int not null,
constraint [pk_person] primary key clustered (ID asc, CompositeID1 asc, CompositeID2 asc)
}