【发布时间】:2018-03-07 14:26:21
【问题描述】:
我有两张表,Parent 和 Child。 Parent 有一个来自 Child 的外键。
我正在编写一个将 n 条记录插入 Child 的脚本,我需要将 n 个 Child 记录中新生成的主键返回到临时表。此外,它需要存储 Parent.Parent_Key 以便我可以将其用作以后的查找(我可以在与 Parent 的连接中获得)。
我打算在一次提交中将 m 条记录插入 Parent 时使用临时表。临时表本质上是一个查找表。
重新表述问题: 父表和子表已填充。为简单起见,假设 Parent 有主键 Parent.Parent_key 和外键 Child.Child_key。 Child 具有主键 Child_key 和 Child_name 属性。我正在尝试插入重复的子行(用于修复),获取那些新的 child_keys,将它们与 parent_key 配对到临时表中,以便我可以将其用作查找。
这是由于语法错误而无法工作的 Child 的插入查询 - 这种方法在 ORACLE SQL 中是否可行?
CREATE GLOBAL TEMPORARY TABLE DUPLICATE_CHILD (
PARENT_KEY int,
CHILD_KEY int);
INSERT INTO CHILD (CHILD_NAME)
SELECT
c.CHILD_NAME
FROM
CHILD c
JOIN PARENT p
ON p.CHILD_KEY = c.CHILD_KEY
RETURNING p.PARENT_KEY, c.CHILD_KEY BULK COLLECT INTO DUPLICATE_CHILD;
【问题讨论】:
-
CHILD_KEY和CHILD_NAME是从哪里来的——你似乎是根据现有记录创建重复名称,所以它们会自动获得新的子键吗?并且子表没有父PK的FK,而不是父引用它的子(ren)吗?也许如果你添加 DDL 和示例数据和结果会更清楚。 -
Returning子句仅在 PLSQL 中有效,如果您使用Select语句进行插入,则它无法工作。如果您使用带有values的插入语句,它应该可以工作。顺便说一句,你得到什么错误? -
@AlexPoole 这些属性来自子表。没错,它们将是重复的,因此大概会生成新的 CHILD_KEY。 Parent 表保存着 Chlid 表的键 (Child_Key)。
-
@operationcwl 这是一条 SQL Developer 消息(当您将鼠标悬停在红线上时);如果你运行它,你会得到“ORA-00933 SQL 命令没有正确结束”。我仍然不确定你真正想要做什么......
-
您应该edit your question 解释这一点,而不是试图在评论中这样做。同样,样本数据会有所帮助。尝试获取 new 子键也很重要;如果有效,您的代码将获得旧代码(
c.CHILD_KEY,这是现有记录);你可以用insert all做,但这对新的键值没有帮助....
标签: oracle plsql temp-tables insert-into sql-returning