【问题标题】:SQL Migrate: Split table into two tables with foreign keySQL Migrate:使用外键将表拆分为两个表
【发布时间】:2017-04-03 16:25:59
【问题描述】:

如何通过 SQL 将下表迁移到具有外键的两个拆分表中。

当前表:

身份证 |姓名 | VAL1 | VAL2 | VAL3 --------------------------------- 1102 |约翰 | 100 | 200 | 300 1103 |凯特 | 110 | 210 | 310

目标表:

身份证 |姓名 | VAL_ID ID | VAL1 | VAL2 | VAL3 ---------------------- ---------- 1102 |约翰 | 1 1 | 100 | 200 | 300 1103 |凯特 | 2 2 | 110 | 210 | 310

【问题讨论】:

  • 添加 VAL_ID 而不为两个表使用 ID 的任何原因?
  • @DuduMarkovitz,是的。迁移后,可能会将相同的值分配给不同的用户(名称)。一对多关系。
  • 在那种情况下,不是生成一组不同的(val1,val2,val3)然后才生成val_id吗?

标签: sql postgresql migrate


【解决方案1】:

嗯。 . .

create table t1 as 
    select id, name, row_number() over (order by id) as val_id
    from t;

create table t2 as
    select t1.val_id, val1, val2, val3
    from t join
         t1
         on t.name = t1.name;

【讨论】:

  • 我怀疑生成 VAL_ID 的整个概念,但如果你这样做 (1) 为什么要按名称而不是 id 加入? (2) 为什么在两个表都可以使用 row_number 时首先加入?
  • @DuduMarkovitz 。 . . id 在创建之前不存在。我不关注你的评论。
  • 我说的是你加入的tt1 中存在的原始id。我们不能相信 name 是唯一的,因此超出此示例的范围,JOIN 很可能会产生错误的结果。
【解决方案2】:

当可以使用 ID 时,我认为没有理由生成 VAL_ID,这也是此用例的常见做法。

create table base_table as select id,name from src;
alter table  base_table add primary key (id);

create table values_table as select id,val1,val2,val3 from src;
alter table  values_table add primary key (id);
alter table  values_table add foreign key (id) references base_table(id);

只是为了满足OP:

create table base_table as select id,name,row_number()over(order by id) as val_id from src;
alter table  base_table add primary key (id);
alter table  base_table add unique (val_id);

create table values_table as select row_number()over(order by id) as id,val1,val2,val3 from src;
alter table  values_table add primary key (id);
alter table  values_table add foreign key (id) references base_table(val_id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2020-08-05
    相关资源
    最近更新 更多