【问题标题】:Inserting one record at a time to multiple tables from a table一次将一条记录插入到表中的多个表中
【发布时间】:2010-02-26 01:08:35
【问题描述】:

我有一个平面 MAIN_TABLE。我需要将此表中的记录插入到多个表中。

例如。

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 移动到我在上面定义的关系结构中。

任何帮助将不胜感激?

谢谢

【问题讨论】:

  • 你把它标记为oracle、sql-server和mysql,你需要用相同的解决方案支持所有平台吗?
  • 是什么阻止您运行“插入...选择...”4次?

标签: sql mysql sql-server oracle


【解决方案1】:

在 Oracle 中,您可以使用 Multi-Table inserts。 创建一个虚拟错误记录表

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));

然后在 (col1,col2) 上为 parent1 添加唯一键,在 (col3,col4) 上为 parent2 添加唯一键。 使用多表插入加载到两个父表中。 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 中进行选择,加入 parent1_table 和 parent2_table 以获取新的 PK,这是一个简单的插入 PARENT2_CHILD_TABLE

【讨论】:

    【解决方案2】:

    如果这是在 SQL Server 中,您可以创建 MAIN_TABLE 的视图,然后在视图上编写 INSTEAD OF INSERT 触发器。这样,当您将INSERT 一条记录添加到您的MAIN_TABLE 视图中时,您的触发器可以将其解析到您的子表中。 Link goodness.

    【讨论】:

    • MAIN_TABLE 上已有数据。我需要将该数据移动到关系结构表中
    • 哇,以前从未听说过INSTEAD OF TRIGGER。让同事感到困惑的好方法!
    • 您可以创建具有相同架构的代理表,在此基础上创建视图和触发器,然后使用 BCP cmd 进行批量插入。以下是一些其他选项:databasejournal.com/features/mssql/article.php/3507171/…
    • 其实是不允许使用触发器的。
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多