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

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

Любые решения дляэто?

Ответы [ 4 ]

24 голосов
/ 28 мая 2011

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

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

Вам также следует задуматься о том, действительно ли вам нужно принимать NULL-платежи.

12 голосов
/ 27 мая 2011

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

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

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

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

1 голос
/ 12 ноября 2012

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

CREATE TABLE ticket (
     id INTEGER PRIMARY,
     seat TEXT, payment INTEGER,
     PRIMARY KEY (id, seat))
0 голосов
/ 04 декабря 2018

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