我知道使用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 三:
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 三:
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
。约束如何重命名?