Sql 用于在不同架构的表之间拆分行的迁移脚本

Sql 用于在不同架构的表之间拆分行的迁移脚本,sql,oracle,data-migration,Sql,Oracle,Data Migration,我有一个包含以下列的表,我正试图按如下方式拆分它。如何在Oracle中为以下转换编写迁移脚本 资料来源: create table abc (id pk, col1, col2, col3, col4, col5, col6) 目标: create table def (id pk, col1, col2) create table ghi (id pk, def_id fk, value) 考虑到这个起点 insert into table abc values (1, 1, 2, 3,

我有一个包含以下列的表,我正试图按如下方式拆分它。如何在Oracle中为以下转换编写迁移脚本

资料来源:

create table abc (id pk, col1, col2, col3, col4, col5, col6)
目标:

create table def (id pk, col1, col2)
create table ghi (id pk, def_id fk, value)
考虑到这个起点

insert into table abc values (1, 1, 2, 3, 4, 5, 6)
insert into table abc values (2, 7, 8, 9, 10, 11, 12)
。。。转换后的数据映射如下

def contains (1, 1, 2)
ghi contains (1, 1, 3)
ghi contains (2, 1, 4)
ghi contains (3, 1, 5)
ghi contains (4, 1, 6)

def contains (2, 7, 8)
ghi contains (5, 2, 9)
ghi contains (6, 2, 10)
ghi contains (7, 2, 11)
ghi contains (8, 2, 12)

最重要的限制是,仅当
abc
中的相应列值为
notnull

时,我才想在
ghi
中生成行。我认为最简单的方法是从源表中选择两个。第一个很简单:

insert into def
select id, col1, col2 from abc
第二个使用INSERT ALL语法:

INSERT ALL
   WHEN col3 is not null THEN
      INTO ghi values (some_seq.nextval, id, col3)
   WHEN col4 is not null THEN
      INTO ghi values (some_seq.nextval, id, col4)
   WHEN col5 is not null THEN
      INTO ghi values (some_seq.nextval, id, col5)
   WHEN col6 is not null THEN
      INTO ghi values (some_seq.nextval, id, col6)
   SELECT id, col3, col4, col5, col6
      FROM abc;
注意,我假定一个序列SOME_SEQ是GHI主键值的来源。你可能需要一些其他的机制


嗯,运行我的代码后,我得到以下结果:

SQL> select * from ghi;

        ID     DEF_ID      VALUE
---------- ---------- ----------
         1          1          3
         2          2          9
         1          1          4
         2          2         10
         1          1          5
         2          2         11
         1          1          6
         2          2         12

8 rows selected.

SQL> 
如您所见,有些只在ABC中增加了两行,而不是在GHI中增加了八行。这是有意义的,因为在同一语句中对NEXTVAL的两个调用返回相同的值,但我希望每个插入将分别计算

哦,好吧。这意味着对于迁移,在填充主键之前,无法在GHI上强制执行主键。所以

  • 禁用主键(或创建没有主键的表)
  • 用ABC的数据填充它
  • 填充主键列(以任何方式)
  • 启用主键约束

  • 或者,您需要找到其他方法来填充GHI ID列

    我认为最简单的方法是从源表中选择两个选项。第一个很简单:

    insert into def
    select id, col1, col2 from abc
    
    第二个使用INSERT ALL语法:

    INSERT ALL
       WHEN col3 is not null THEN
          INTO ghi values (some_seq.nextval, id, col3)
       WHEN col4 is not null THEN
          INTO ghi values (some_seq.nextval, id, col4)
       WHEN col5 is not null THEN
          INTO ghi values (some_seq.nextval, id, col5)
       WHEN col6 is not null THEN
          INTO ghi values (some_seq.nextval, id, col6)
       SELECT id, col3, col4, col5, col6
          FROM abc;
    
    注意,我假定一个序列SOME_SEQ是GHI主键值的来源。你可能需要一些其他的机制


    嗯,运行我的代码后,我得到以下结果:

    SQL> select * from ghi;
    
            ID     DEF_ID      VALUE
    ---------- ---------- ----------
             1          1          3
             2          2          9
             1          1          4
             2          2         10
             1          1          5
             2          2         11
             1          1          6
             2          2         12
    
    8 rows selected.
    
    SQL> 
    
    如您所见,有些只在ABC中增加了两行,而不是在GHI中增加了八行。这是有意义的,因为在同一语句中对NEXTVAL的两个调用返回相同的值,但我希望每个插入将分别计算

    哦,好吧。这意味着对于迁移,在填充主键之前,无法在GHI上强制执行主键。所以

  • 禁用主键(或创建没有主键的表)
  • 用ABC的数据填充它
  • 填充主键列(以任何方式)
  • 启用主键约束

  • 或者,您需要找到其他方法来填充GHI ID列

    感谢您提供接近正确SQL的内容,以便我们能够理解您的问题。但是,为了获得满分,您应该提供可运行的DDL和DML,而不是需要编辑的伪SQL。感谢您提供接近正确SQL的内容,以便我们能够理解您的问题。但是,对于满分,您应该提供可运行的DDL和DML,而不是需要编辑的伪SQL。我无法禁用主键,我将尝试其他选项。无法禁用主键是一个不寻常的限制。通常,数据迁移是一种TAZ,在这种情况下,如果所有数据完整性约束都已就位且在练习结束时有效,则可以在咀嚼数据时暂停规则。我将无法禁用主键,我将尝试其他选项。无法禁用主键是一种不寻常的限制。通常情况下,数据迁移是一个TAZ,在这个TAZ中,只要所有数据完整性约束都在适当的位置,并且在练习结束时有效,就可以在我们咀嚼数据时暂停规则。