我知道,使用一个PostgreSQL的表SERIAL
PostgreSQL所创建的主键结了一个隐含的指数,序列和约束。 现在的问题是如何在重命名了表重命名这些隐含对象。 下面是我在末尾的具体问题搞清楚了这一点尝试。
给定一个表,如:
CREATE TABLE foo (
pkey SERIAL PRIMARY KEY,
value INTEGER
);
Postgres的输出:
注意:CREATE TABLE将创建隐序列“foo_pkey_seq”串行列“foo.pkey”
注意:CREATE TABLE / PRIMARY KEY将创建隐式索引 “foo_pkey” 对表 “富”
查询没有结果在52毫秒成功返回。
pgAdmin的III SQL窗格显示表(decluttered)以下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
。 约束如何改名?