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