0

データベースのスキーマを更新したい。自動生成されたスクリプトをコピーしましたが、各テーブルのスクリプトの後の最後の行は次のとおりです。

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

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

4

1 に答える 1

1

「自動生成された」スクリプトが.dumpデータベース全体を意味する場合は、create tableステートメントとステートメントが含まれるinsertため、おそらくupdate一緒に実行する必要があります。

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

ドキュメントの内容は次のとおりです。

SQLiteは、特別なSQLITE_SEQUENCEテーブルを使用して、テーブルがこれまでに保持した最大のROWIDを追跡します。SQLITE_SEQUENCE表は、AUTOINCREMENT列を含む通常の表が作成されるたびに自動的に作成および初期化されます。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;
于 2012-04-18T14:48:46.283 に答える