【发布时间】:2014-01-22 16:48:49
【问题描述】:
如果您有一对具有数字主键和父子关系的表,那么在这些表中复制记录的最佳方法是什么,如果您将其作为两个单独的插入操作,则父键将变了吗?
也许最好用一个例子来解释。假设您有以下表结构:
CREATE TABLE APARENT (
APARENT_CODE NUMBER, -- primary key
AVALUE1 NUMBER,
AVALUE2 NUMBER
);
CREATE TABLE ACHILD (
ACHILD_CODE NUMBER, -- primary key
APARENT_CODE NUMBER, -- foreign key
AVALUE3 NUMBER
);
APARENT 中的值是父记录。它们可能在ACHILD 表中有许多记录,通过APARENT_CODE 字段链接回它们。
复制记录的最佳方式是什么(包括单个父记录,可能还有多个子记录)?我的困惑是因为当您将重复记录插入父表时,您必须更改主键值(在这种情况下通过序列)所以当您插入子记录时,您如何知道要链接它们的外键值去?
编辑:抱歉,如果不清楚,请进行编辑:第一次插入复制多条记录,因此不能在第二次插入中使用 CURRVAL。
目前我正在使用此代码:
CREATE TABLE TMP_CODES (
OLD_APARENT_CODE NUMBER,
NEW_APARENT_CODE NUMBER
);
INSERT INTO TMP_CODES
SELECT APARENT_CODE,
SQ_APARENT.NEXTVAL -- gets new sequence value
FROM APARENT
WHERE AVALUE1 = 10;
INSERT INTO APARENT
SELECT C.NEW_APARENT_CODE, -- the copied parent records get a new sequence value
A.VALUE1,
A.VALUE2
FROM APARENT A,
TMP_CODES C
WHERE A.AVALUE1 = 10
AND C.OLD_APARENT_CODE = A.APARENT_CODE;
INSERT INTO ACHILD
SELECT SQ_ACHILD.NEXTVAL, -- a new sequence value for the primary key
C.NEW_APARENT_CODE, -- this inserts the correct link value
A.VALUE3
FROM ACHILD A,
TMP_CODES C
WHERE C.OLD_APARENT_CODE = A.APARENT_CODE;
我只是想知道是否有更有效的方法,而不是先将所有代码表达到临时表中。
我正在使用 Oracle 10。感谢您的帮助。
【问题讨论】:
标签: sql oracle parent-child