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.

21
demandé sur iliaden 2011-08-08 16:32:49

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

27
répondu Icarus 2013-10-05 18:40:00

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.' );
2
répondu ZNorQ 2016-08-17 13:45:30

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.

1
répondu Peter vd Merwe 2011-08-08 12:40:48

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)
    );
0
répondu user2971852 2013-12-16 22:37:31