SQLite multi-Primary Key для таблицы, одним из которых является автоинкремент

У меня есть несколько (составных) первичных ключей в таблице, и один из них будет автоматически увеличиваться. Тем не менее, интересно, что 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).

Вы знаете какое-нибудь решение?

3 ответа

Решение

Нет, я не думаю, что это возможно.

Вы можете создать UNIQUE INDEX который по сути имеет тот же эффект, что и ПЕРВИЧНЫЙ КЛЮЧ:

CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");

Кроме того, я не вижу логики вашей схемы, то есть -> если столбец имеет автоинкремент и вы не намерены связываться со значениями вручную, он все равно будет уникальным, поэтому он создает хороший простой короткий первичный ключ, Почему композит? У вас могут быть веские причины сделать еще один индекс для комбинации столбцов.

UNIQUE INDEX один не имеет такого же эффекта, как PRIMARY KEY, Уникальный индекс позволит NULL; ограничение первичного ключа не будет. Вам лучше объявить оба эти ограничения.

CREATE TABLE ticket (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     seat TEXT NOT NULL, 
     payment INTEGER,
     UNIQUE (id, seat));

Вы также должны хорошо подумать о том, действительно ли вам нужно принимать пустые платежи.

Вы также можете написать так:

CREATE TABLE ticket (
     id INTEGER PRIMARY,
     seat TEXT, payment INTEGER,
     PRIMARY KEY (id, seat))

Удивительно, но мне удалось реализовать автоинкремент для 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)
}
Другие вопросы по тегам