2010-07-20 16 views
4

Je veux essentiellement convertir une table de MySQL à SQLite le schéma suivant:sqlite: clé primaire multi-colonne avec une colonne d'incrémentation automatique

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

Essentiellement, je veux ID à incrémentation automatique chaque fois que j'insérer quoi que ce soit dans la table, avec la VERSION commençant à 0, mais permettent toujours plusieurs articles avec le même ID tant que la VERSION est différente.

J'essaye de reproduire ce comportement avec Sqlite cependant, je ne peux pas sembler faire fonctionner la création de table. Il semble que vous ne pouvez utiliser qu'une seule colonne comme auto-incrémentation et que ce soit la clé primaire. Si je mets l'ID comme clé primaire, je ne peux pas utiliser VERSION comme partie de la clé. Cependant, si je crée une clé à plusieurs colonnes (ID, VERSION), je ne peux pas obtenir l'ID en incrémentation automatique.

Y at-il une solution de contournement ou peut-être une meilleure façon de concevoir ma table?


Je pensais à la solution suivante:

Tableau 1:

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

Tableau 2:

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

Quand j'ajouter un nouvel élément, j'ajouter à articles et ont l'incrément automatique d'identification. cependant, si j'ai déjà une nouvelle version du même identifiant, je l'ajoute à item_version. Fondamentalement, j'utilise item_version pour contenir tout sauf des éléments pour simplement générer des identifiants uniques.

Répondre

-3

Les clés primaires ne sont-elles pas incrémentées automatiquement dans SQLlite?

+0

Ils peuvent si vous le spécifiez. 'CREATE TABLE MyTable (Col1 INTEGER PRIMARY KEY AUTOINCREMENT)' par exemple – MPelletier

+0

Pas si vous avez plusieurs clés primaires comme dans ce cas. – Sam

7

Malheureusement, il n'y a pas une telle fonctionnalité, il existe AFAIK seulement dans MySQL.

Quand je besoin de quelque chose que je viens d'utiliser SQL lors de l'insertion de nouvelles lignes:

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

Ce qui a fonctionné de moi.

Vous pouvez également créer un déclencheur qui mettrait à jour la version correctement:

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; 

Maintenant, chaque fois que vous insérez une nouvelle valeur dans le tableau:

> 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 

Comme vous pouvez le voir crée la version pour l'identifiant nouvellement inséré. À partir de 1. Vous pouvez bricoler avec un peu afin d'obtenir quelque chose de différent.

+0

Il semble que ce sql incrémente la version lorsque vous insérez une nouvelle ligne du même identifiant. mon problème est que je ne peux même pas comprendre comment configurer la table pour permettre cela parce que je dois choisir entre une clé primaire d'une seule colonne qui incrémente automatiquement ou une clé primaire multi-colonne sans incrémentation automatique. – Dave

+0

@Dave voir mes modifications – Artyom