2012-04-18 25 views
0

dbのスキーマを更新したいと思います。私は、自動生成されたスクリプトをコピーしたが、各テーブルのスクリプト後の最後の行はこれです:Sqliteの更新と自動インクリメントの値

UPDATE "main"."sqlite_sequence" SET seq = 8 WHERE name = 'table'; 

sec値が実際に私のインストールDBの正しいですが、それは他のインストールに変えることができます。したがって、0に設定するのは安全でしょうか、または各インストールのテーブルから選択する必要がありますか?または、私はこの行をスキップして、スクリプトを実行せずにスクリプトを実行できますか?

答えて

1

あなたはおそらくupdateに沿って実行させたいので、それは、create table文、およびinsert文が含まれ、データベースの完全な.dumpを意味する「自動生成」スクリプトによって場合。

自動生成されたスクリプトを修正する場合は、必要に応じて明らかにseq値を変更できます。

SQLiteのテーブルが今まで特別なSQLITE_SEQUENCEテーブルを使用して を開催した最大のROWIDを追跡します:ここで

documentationが言っているものです。 にAUTOINCREMENT列が含まれる通常の表が作成されるたびに、SQLITE_SEQUENCE表は が作成され、自動的に初期化されます。 SQLITE_SEQUENCEテーブルの内容は、通常のUPDATE、INSERT、 およびDELETEステートメントを使用して変更できます。しかし、このテーブルを修正すると はおそらくAUTOINCREMENTキー生成アルゴリズムを混乱させるでしょう。あなたがそのような変更を行う前に、あなたが何をしているのかをあなたが知っていることを確認してください( )。

最後に、seq値が最高値と一致することを確認する必要があります。これは次のようになります。

sqlite> create table foo (a INTEGER PRIMARY KEY AUTOINCREMENT, b text); 
sqlite> insert into foo values (NULL, 'blabla'); 
sqlite> select * from foo; 
1|blabla 
sqlite> .dump 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE foo (a INTEGER PRIMARY KEY AUTOINCREMENT, b text); 
INSERT INTO "foo" VALUES(1,'blabla'); 
DELETE FROM sqlite_sequence; 
INSERT INTO "sqlite_sequence" VALUES('foo',1); 
COMMIT; 
+0

デザイナーで手作業で修正した後、 "SQLプレビュー"に表示されたコードをコピーしました。 – iCantSeeSharp

+0

だから、私はsql_sequenceテーブルを変更しないかどうか、正しい値を含んでいなければならないと思います。 – iCantSeeSharp

+0

はい、特定のテーブルのすべての挿入を実行するだけの場合、 'seq'の更新はシーケンスを整列させる必要があります。 OTOH最初に挿入する必要があります...あなたはsqlite_sequenceの挿入も持っていますか? –

関連する問題