0

もともと複合外部/主キーで設計されたSQLiteデータベーススキーマに取り組んでおり、代わりに代理キーを使用するように変更しようとしています。サロゲートキーの新しい列を作成するのは簡単でしたが、サロゲートキーを親テーブルにリンクする必要があります。これを行うための最良の方法は何ですか。

古いスキーマの抜粋:

CREATE TABLE "parent" (
    "caseid"  TEXT NOT NULL,
    "issueid" INTEGER NOT NULL,
    "data"    TEXT,
    PRIMARY KEY("caseid", "issueid")
)

CREATE TABLE "child" (
    "caseid"    TEXT NOT NULL,
    "issueid"   INTEGER NOT NULL,
    "childdata" TEXT,
    FOREIGN KEY("caseid", "issueid") REFERENCES parent("caseid", "issueid")
)

新しいスキーマの抜粋:

CREATE TABLE "parent" (
    "id"      INTEGER PRIMARY KEY,
    "caseid"  TEXT NOT NULL,
    "issueid" INTEGER NOT NULL,
    "data"    TEXT
)

CREATE TABLE "child" (
    "id"        INTEGER PRIMARY KEY,
    "childdata" TEXT,
    "parent_id" INTEGER REFERENCES parent("id")
)

私の質問は、新しい子テーブルに元の子テーブルのデータを入力した後、「parent_id」フィールドに入力するにはどうすればよいですか。これは、複合外部キーではなく代理キーになりました。SQLコマンドとしてこれを行う簡単な方法はありますか?

4

1 に答える 1

2

最初childに新しい列を追加してテーブルを変更しますが、古い+列idは(まだ)削除しません。caseidissueid

CREATE TABLE "parent" (
    "id"      INTEGER PRIMARY KEY,
    "caseid"  TEXT NOT NULL,
    "issueid" INTEGER NOT NULL,
    "data"    TEXT
);

CREATE TABLE "child" (
    "id"        INTEGER PRIMARY KEY,
    "caseid"    TEXT NOT NULL,
    "issueid"   INTEGER NOT NULL,
    "childdata" TEXT,
    "parent_id" INTEGER REFERENCES parent("id")
);

child.parent_id意味のある値で更新します。

UPDATE child
SET parent_id = (
  SELECT parent.id
  FROM   parent
  WHERE  parent.caseid  = child.caseid
    AND  parent.issueid = child.issueid
);

childこれで、 's caseid/issueid列を安全にドロップできます。

于 2012-07-03T06:31:40.167 に答える