SQLite auto-incrément champ de clé non primaire
Est-il possible d'avoir une clé non primaire à incrémenter automatiquement à chaque insertion?
Par exemple, je veux avoir un journal, où chaque entrée de journal a une clé primaire (pour usage interne), et un numéro de révision ( INT valeur que je veux être auto-incrémenté).
Comme solution de contournement, cela pourrait être fait avec une séquence, mais je crois que les séquences ne sont pas prises en charge dans SQLite.
4 réponses
Vous pouvez faire select max (id) + 1 lorsque vous faites l'insertion.
Par exemple:
INSERT INTO Log (id, rev_no, description)
VALUES ((SELECT MAX(id) + 1 FROM log), 'rev_Id', 'some description')
Notez que cela échouera sur une table vide car il n'y aura pas d'enregistrement avec id
est 0 mais vous pouvez ajouter une première entrée factice ou changer l'instruction sql à ceci:
INSERT INTO Log (id, rev_no, description)
VALUES ((SELECT IFNULL(MAX(id), 0) + 1 FROM Log), 'rev_Id', 'some description')
SQLite crée automatiquement un ID de ligne unique (rowid). Ce champ est généralement omis lorsque vous utilisez " select * ...", mais vous pouvez récupérer cet id en utilisant " select rowid,* ...". Sachez que selon la documentation SQLite, ils découragent l'utilisation de l'auto-incrémentation.
create table myTable ( code text, description text );
insert into myTable values ( 'X', 'some descr.' );
select rowid, * from myTable;
:: le résultat sera; 1 / x / certains descr.
Si vous utilisez cet id comme clé étrangère, vous pouvez exporter rowid - et importer la valeur correcte afin de conserver l'intégrité des données;
insert into myTable values( rowid, code text, description text ) values
( 1894, 'X', 'some descr.' );
Vous pouvez utiliser un déclencheur ( http://www.sqlite.org/lang_createtrigger.html ) qui vérifie la valeur la plus élevée précédente, puis l'incrémente, ou si vous faites vos insertions dans une procédure stockée, mettez cette même logique là-dedans.
Ma réponse est très similaire à celle D'Icarus, donc je n'ai pas besoin de le mentionner.
Vous pouvez utiliser la solution D'Icarus de manière plus avancée si nécessaire. Voici un exemple de table de disponibilité des sièges pour un système de réservation de train.
insert into Availiability (date,trainid,stationid,coach,seatno)
values (
'11-NOV-2013',
12076,
'SRR',
1,
(select max(seatno)+1
from Availiability
where date='11-NOV-2013'
and trainid=12076
and stationid='SRR'
and coach=1)
);