sqlite: многоколонный первичный ключ с автоинкрементным столбцом - PullRequest
5 голосов
/ 20 июля 2010

Я в основном хочу преобразовать таблицу из mysql в sqlite по следующей схеме:

create table items (
id integer auto_increment,
version integer default 0,
primary key (id, version)
);

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

Я пытаюсь воспроизвести это поведение с помощью Sqlite, однако не могу заставить работать создание таблиц. Похоже, что вам разрешен только один столбец в качестве автоинкремента, и он должен быть первичным ключом. Если я сделаю ID первичным ключом, я не смогу использовать VERSION как часть ключа. Однако, если я сделаю ключ из нескольких столбцов (ID, VERSION), я не смогу получить ID для автоматического увеличения.

Есть ли обходной путь или, возможно, лучший способ разработки моего стола?


Я думал о следующем решении:

Таблица 1:

create table items {
id integer primary autoincrement,
version integer}

Таблица 2:

create table item_version {
id integer,
version integer,
primary key (id, version)
}

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

Ответы [ 2 ]

8 голосов
/ 20 июля 2010

К сожалению, такой функции нет, она существует AFAIK только в MySQL.

Когда мне нужно что-то подобное, я просто использовал следующий SQL для вставки новых строк:

INSERT INTO items(id,version) 
SELECT new_id,SELECT COALESCE(MAX(version),0)+1 FROM items WHERE id=new_id)

Вот чтоработал от меня.

Вы также можете создать триггер, который будет корректно обновлять версию:

create trigger my_increment
after insert 
on items 
begin 
    update items 
    set version=(select max(version) from items where id=new.id)+1 
    where id=new.id and version = 0;
end;

Теперь каждый раз, когда вы вставляете новое значение в таблицу:

> insert into items(id) values(10);
> insert into items(id) values(15);
> insert into items(id) values(10);
> select * from items;
10|1
15|1
10|2

Как видите, он создает версию для вновь вставленного идентификатора.Начиная с 1. Вы можете немного повозиться, чтобы получить что-то другое.

0 голосов
/ 20 июля 2010

Разве целочисленные первичные ключи автоматически увеличиваются в SQLlite?

...