Postgresql - 将外键更改为另一列

时间:2013-11-19 17:11:28

标签: sql postgresql

我有两张桌子:

create table test1 (
oldPrimaryKey varchar(100) primary key, 
someText varchar(100)
)

create table test2 (
someText varchar(100),
 oldPrimaryKey varchar(100) references test1(oldPrimaryKey)
)

我需要将oldPrimaryKey更改为新的,所以我这样做:

  1. 丢弃旧的一把钥匙:

    • alter table test1 drop constraint test1_pkey;
    • alter table test2 drop constraint test2_oldprimarykey_fkey;
  2. 创建新列:

    • alter table test1 add column newPrimaryKey bigint;
  3. 使用序列填充它:
    • 创建序列add_id_seq以1个增量1缓存开始;
    • 更新test1 set newPrimaryKey = nextval('add_id_seq');
  4. 将“newPrimaryKey”列更改为主键:
    • alter table test1 add constraint keyName主键(newPrimaryKey);
  5. 现在我有这样的事情:

    CREATE TABLE test1
    (
      oldprimarykey character varying(100) NOT NULL,
      sometext character varying(100),
      newprimarykey bigint NOT NULL,
      CONSTRAINT keyname PRIMARY KEY (newprimarykey)
    )
    
    CREATE TABLE test2
    (
      sometext character varying(100),
      oldprimarykey character varying(100),
      CONSTRAINT test2_oldprimarykey_fkey FOREIGN KEY (oldprimarykey)
          REFERENCES test1 (oldprimarykey) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION
    )
    

    我现在不知道该做什么(某些脚本?)。我需要将表test2oldprimarykey的值更改为表test1newprimarykey中的相应值。

    如果它太混乱,我会尝试举例说明正常数据:

    来自table1的行(oldprimarykey,sometext,newprimarykey):

    1. test@test.com,'some text',1
    2. test2@test.com,'更多文字',2
    3. table2中的相应行(sometext,oldprimarykey):

      1. 'some text',test @ test.com
      2. 'text text',test2test.com
      3. 我想将table2中的电子邮件地址从table1更改为相应的int。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

update test2
  set newprimarykey = t1.newprimarykey
from test1 t1
where t1.oldprimarykey = test2.oldprimarykey;

SQLFiddle示例:http://sqlfiddle.com/#!15/e558a/1