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