10

私は SQLite を使用しており、プロパティ用のテーブルとサブプロパティ用のテーブルがあります。各サブプロパティは、fkPropertyId 列を使用してその親を指します。現在、初期データベースを作成するために、次のようなスクリプトを用意しています。

INSERT INTO property VALUES(1,.....);
INSERT INTO property VALUES(2,.....);
INSERT INTO property VALUES(3,.....);
   INSERT INTO subproperty VALUES(1,.....,3);
   INSERT INTO subproperty VALUES(2,.....,3);
   INSERT INTO subproperty VALUES(3,.....,3);
INSERT INTO property VALUES(4,.....);

ここで、ハードコーディングされたrowIdを取り除きたいので、次のようになります:

INSERT INTO property VALUES(NULL,.....);
INSERT INTO property VALUES(NULL,.....);
INSERT INTO property VALUES(NULL,.....);
   INSERT INTO subproperty VALUES(NULL,.....,X);
   INSERT INTO subproperty VALUES(NULL,.....,X);
   INSERT INTO subproperty VALUES(NULL,.....,X);
INSERT INTO property VALUES(NULL,.....);

x は、プロパティ テーブルに最後に挿入された rowId を参照します。今のところ、それは

(SELECT MAX(rowId) FROM property)

このスクリプトを作成するためのより良い (そして技術的により正確な) 方法はありますか?

4

2 に答える 2

4

さて、私が思いついた解決策は、BenSのlast_insert_rowid関数を使用しました。

INSERT INTO property VALUES(NULL,.....);
INSERT INTO property VALUES(NULL,.....);

   INSERT INTO subproperty VALUES(1,.....,-1);
   INSERT INTO subproperty VALUES(2,.....,-1);
   INSERT INTO subproperty VALUES(3,.....,-1);
INSERT INTO property VALUES(NULL,.....);
UPDATE subproperty SET fkPropertyId = (SELECT last_insert_rowid()) WHERE fkPropertyId=-1;

INSERT INTO property VALUES(NULL,.....);

それが最善のアプローチかどうかはわかりませんが、私にとってはうまくいき、一時的なデータストレージに余分なテーブルを使用しません。

于 2009-12-03T17:39:56.370 に答える