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,但不(尚未)删除旧的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,
    "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 回答