从一个表格逐条向多个表格插入记录

3
我可以帮助您翻译以下内容:

我有一个扁平的MAIN_TABLE。我需要将这个表中的记录插入到多个TABLES中。

例如:

MAIN_TABLE
col1, col2, col3, col4, col5

PARENT1_TABLE
PT1_ID(PK), col1,col2

PARENT2_TABLE
PT2_ID(PK), col3,col4

PARENT2_CHILD_TABLE
P2C_ID(PK), PT2_ID(FK), col5, col6

所以,我的目标是将记录从那个扁平的MAIN_TABLE移动到我上面定义的关系结构中。

任何帮助都将不胜感激?

谢谢


1
你将这个标记为了Oracle、SQL Server和MySQL,你需要用同一个解决方案支持所有平台吗? - Nick Craver
什么阻止你运行 "insert into ... select ..." 四次? - Martin
2个回答

7
在Oracle中,你可以使用多表插入语句。 创建一个虚拟的错误日志表。
create global temporary table err_dump
  (ORA_ERR_NUMBER$   NUMBER,
  ORA_ERR_MESG$     VARCHAR2(2000),
  ORA_ERR_ROWID$    UROWID(4000),
  ORA_ERR_OPTYP$    VARCHAR2(2),
  ORA_ERR_TAG$      VARCHAR2(2000));

然后在parent1上添加(col1,col2)的唯一索引,在parent2上添加(col3,col4)的唯一索引。 使用多表插入将数据加载到这两个父表中。LOG ERRORS INTO子句意味着任何重复的数据都将被拒绝。

INSERT ALL
      INTO parent1_table (pt1_id, col1,col2)
      VALUES (rn, col1,col2)
      LOG ERRORS INTO err_dump REJECT LIMIT 99999999
      INTO parent2_table (pt2_id, col3, col4)
      VALUES (rn, col3, col4)
      LOG ERRORS INTO err_dump REJECT LIMIT 99999999
   SELECT rownum rn, col1, col2, col3, col4
   FROM MAIN_TABLE;

最后,从 MAIN 表执行 select 操作,与 parent1_table 和 parent2_table 进行连接以获取新的主键,然后将其插入 PARENT2_CHILD_TABLE 中即可。

2
如果这是在SQL Server中,您可以创建一个MAIN_TABLE的视图,然后在视图上编写一个INSTEAD OF INSERT触发器。这样,当您向MAIN_TABLE视图插入记录时,您的触发器可以将其解析到子表中。链接地址

MAIN_TABLE已经有数据了。我需要将这些数据移动到关系结构表中。 - niceApp
2
哇,之前从未听说过“INSTEAD OF TRIGGER”。这可真是一个让同事困惑的好方法! - MusiGenesis
你可以创建一个具有相同模式的代理表,创建视图和触发器,然后使用BCP命令进行批量插入。以下是其他选项:http://www.databasejournal.com/features/mssql/article.php/3507171/Transferring-Data-from-One-Table-to-Another.htm - davecoulter
实际上,不允许使用触发器。 - niceApp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接