【发布时间】:2013-01-16 23:09:46
【问题描述】:
我知道使用 SERIAL 主键的 PostgreSQL 表最终会由 PostgreSQL 创建隐式索引、序列和约束。问题是在重命名表时如何重命名这些隐式对象。下面是我试图通过最后的具体问题来解决这个问题。
给定一个表格,例如:
CREATE TABLE foo (
pkey SERIAL PRIMARY KEY,
value INTEGER
);
Postgres 输出:
注意:CREATE TABLE 将为串行列“foo.pkey”创建隐式序列“foo_pkey_seq”
注意:CREATE TABLE / PRIMARY KEY 将为表“foo”创建隐式索引“foo_pkey”
查询成功返回,52 毫秒无结果。
pgAdmin III SQL 窗格显示了表的以下 DDL 脚本(已整理):
CREATE TABLE foo (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;
现在重命名表格:
ALTER table foo RENAME TO bar;
查询成功返回,17 毫秒内没有结果。
pgAdmin III:
CREATE TABLE bar (
pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
注意额外的DEFAULT nextval('foo_pkey_seq'::regclass),,这意味着重命名表不会重命名主键的序列,但现在我们有了这个显式的nextval()。
现在重命名序列:
我想保持数据库命名一致,所以我尝试了:
ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
查询成功返回,17 毫秒内没有结果。
pgAdmin III:
CREATE TABLE bar (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
DEFAULT nextval('foo_pkey_seq'::regclass), 不见了。
问题
- 为什么
DEFAULT nextval('foo_pkey_seq'::regclass)语句会出现又消失? - 有没有办法重命名表并同时重命名主键序列?
- 在客户端连接到数据库时重命名表然后排序是否安全,是否存在任何并发问题?
- postgres 如何知道使用哪个序列?内部是否使用了数据库触发器?除了表格和序列之外,还有什么要重命名的吗?
- 主键创建的隐式索引呢?应该改名吗?如果是这样,那该怎么做?
- 上面的约束名称呢?它仍然是
foo_pkey。如何重命名约束?
【问题讨论】:
-
我的猜测是,命名一个序列
<<tablename>>_pkey_seq具有神奇的语法意义,并且 Postgres 知道使用一个这样命名的序列作为表的主键序列并省略明确列出它作为默认值表的主键列的值。不过,我实际上并不知道这一点,也没有任何证据。如果到那时这个问题还没有答案,下班后会进一步调查。
标签: sql postgresql database-design ddl