如何在Postgres中将表从公共模式移动到其他模式

116

Postgres 9.1数据库包含了public架构下的表yksus1……yksus9。pgAdmin会像下面的代码一样显示这些定义。 如何将这些表移动到firma1架构?

firma1架构中的其他表引用了这些表的主键,外键引用只来自于firma1架构下的表。 其中一些表包含数据。如果将表移动到firma1架构下,外键引用也应更新为firma1.yksusn表。表结构不能更改。

看起来,主键序列已经在firma1架构下,因此它们不应该被移动。 版本字符串:PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu,由gcc-4.4.real(Debian 4.4.5-8)4.4.5编译,64位。

CREATE TABLE yksus1
(
  yksus character(10) NOT NULL DEFAULT ((nextval('firma1.yksus1_yksus_seq'::regclass))::text || '_'::text),
  veebis ebool,
  nimetus character(70),
  "timestamp" character(14) DEFAULT to_char(now(), 'YYYYMMDDHH24MISS'::text),
  username character(10) DEFAULT "current_user"(),
  klient character(40),
  superinden character(20),
  telefon character(10),
  aadress character(50),
  tlnr character(15),
  rus character(60),
  CONSTRAINT yksus1_pkey PRIMARY KEY (yksus)
);
ALTER TABLE yksus1
  OWNER TO mydb_owner;

CREATE TRIGGER yksus1_trig
  BEFORE INSERT OR UPDATE OR DELETE
  ON yksus1
  FOR EACH STATEMENT
  EXECUTE PROCEDURE setlastchange();

其他表类似:

CREATE TABLE yksus2
(
  yksus character(10) NOT NULL DEFAULT ((nextval('firma1.yksus2_yksus_seq'::regclass))::text || '_'::text),
  nimetus character(70),
  "timestamp" character(14) DEFAULT to_char(now(), 'YYYYMMDDHH24MISS'::text),
  osakond character(10),
  username character(10) DEFAULT "current_user"(),
  klient character(40),
  superinden character(20),
  telefon character(10),
  aadress character(50),
  tlnr character(15),
  rus character(60),
  CONSTRAINT yksus2_pkey PRIMARY KEY (yksus),
  CONSTRAINT yksus2_osakond_fkey FOREIGN KEY (osakond)
      REFERENCES yksus2 (yksus) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
);
ALTER TABLE yksus2
  OWNER TO mydb_owner;

CREATE TRIGGER yksus2_trig
  BEFORE INSERT OR UPDATE OR DELETE
  ON yksus2
  FOR EACH STATEMENT
  EXECUTE PROCEDURE setlastchange();
1个回答

241

8
请注意名称冲突。如果任何一个表在使用与目标模式相同的索引、约束等名称,则查询将失败。 - Tim
请记住,表格通常与序列相关联,而序列通常也必须被移动。 - Sauron
@Sauron:如果这些列被定义为“serial”或现在推荐的“identity”列,则底层序列也将被移动。 - user330315
如果模式尚不存在,则使用CREATE SCHEMA IF NOT EXISTS foo;创建模式。 - Brian Burns
SET SCHEMA 工作得...几乎完美。你可能有一个带有“DEFAULT nextval(oldschema.seq_name)”或任何其他“DEFAULT old_schema.func_name()”的字段;这不会被转换,并且将一直存在,直到旧模式存在为止。 - Eldhenn
@Eldhenn 如果默认值是通过“identity”或“serial”列定义的,则序列也将被移动。 - user330315

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