web-dev-qa-db-ja.com

SQLiteは非主キーフィールドを自動インクリメントします

挿入のたびに非主キーを自動インクリメントすることは可能ですか?

たとえば、すべてのログエントリに主キー(内部使用用)とリビジョン番号(自動インクリメントするINT値)があるログが必要です。

回避策として、これはシーケンスを使用して実行できますが、SQLiteではシーケンスはサポートされていないと思います。

23
iliaden

挿入を行うときにmax(id)+1を選択できます。

例えば:

INSERT INTO Log (id, rev_no, description) VALUES ((SELECT MAX(id) + 1 FROM log), 'rev_Id', 'some description')

idが0のレコードはないため、空のテーブルでは失敗することに注意してください。ただし、最初のダミーエントリを追加するか、SQLステートメントを次のように変更できます。

INSERT INTO Log (id, rev_no, description) VALUES ((SELECT IFNULL(MAX(id), 0) + 1 FROM Log), 'rev_Id', 'some description')

30
Icarus

SQLiteは一意の行ID(rowid)を自動的に作成します。通常、このフィールドは「select * ...」を使用する場合は省略されますが、「select rowid、* ...」を使用してこのIDを取得できます。 SQLiteのドキュメントによると、自動インクリメントの使用を推奨していないことに注意してください。

create table myTable ( code text, description text );
insert into myTable values ( 'X', 'some descr.' );
select rowid, * from myTable;

::結果は; 1 | X |いくつかの説明。

このIDを外部キーとして使用する場合は、ROWIDをエクスポートできます。また、データの整合性を維持するために正しい値をインポートできます。

insert into myTable values( rowid, code text, description text ) values
( 1894, 'X', 'some descr.' );
3
ZNorQ

私の答えはイカロスの答えと非常に似ているので、言及する必要はありません。

必要に応じて、Icarusのソリューションをより高度な方法で使用できます。以下は、列車予約システムの空席状況表の例です。

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)
    );
1
Navin

前の最大値をチェックしてからインクリメントするトリガー( http://www.sqlite.org/lang_createtrigger.html )を使用するか、ストアドプロシージャで挿入を実行している場合に使用できます。 、同じロジックをそこに入れます。

1
Peter vd Merwe