我想知道所有这些是否完全一样,或者是否存在一些差异。
方法1:
CREATE TABLE testtable
(
id serial,
title character varying,
CONSTRAINT id PRIMARY KEY (id)
);
方法:2
CREATE TABLE testtable
(
id serial PRIMARY KEY,
title character varying,
);
方法3:
CREATE TABLE testtable
(
id integer PRIMARY KEY,
title character varying,
);
CREATE SEQUENCE testtable_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER SEQUENCE testtable_id_seq OWNED BY testtable.id;
更新:我在网上发现了一些内容,即通过使用原始序列,您可以为主键预先分配内存,如果您计划在下一分钟内完成数千次插入操作,这将有所帮助。 / p>
答案 0 :(得分:5)
试一试,看看;删除第二个和第三个“变化”之后的“,”,以便它们运行,执行每一个,然后执行:
\d testtable
在每一个之后,您可以看到会发生什么。然后放下桌子,移到下一个桌子上。它看起来像这样:
Column | Type | Modifiers
--------+-------------------+--------------------------------------------------------
id | integer | not null default nextval('testtable_id_seq'::regclass)
title | character varying |
Indexes:
"id" PRIMARY KEY, btree (id)
Column | Type | Modifiers
--------+-------------------+--------------------------------------------------------
id | integer | not null default nextval('testtable_id_seq'::regclass)
title | character varying |
Indexes:
"testtable_pkey" PRIMARY KEY, btree (id)
Column | Type | Modifiers
--------+-------------------+-----------
id | integer | not null
title | character varying |
Indexes:
"testtable_pkey" PRIMARY KEY, btree (id)
第一个和第二个几乎相同,只是创建的主键名称不同。在第三个中,当您插入数据库时,不再填充序列。您需要先创建序列,然后像这样创建表:
CREATE TABLE testtable
(
id integer PRIMARY KEY DEFAULT nextval('testtable_id_seq'),
title character varying
);
获得与第二个看起来相同的东西。唯一的好处是你可以使用CACHE指令预先分配一些序列号。这可能是一个足够大的资源消耗,你需要降低争用。但是在你可能发生这种情况之前,你需要每秒进行数千次插入,而不是每分钟进行一次。
答案 1 :(得分:3)
方法1和方法2之间没有语义差异。
方法3也很相似 - 这是使用串行时隐式发生的事情。但是,当使用serial时,postgres还会记录序列对表的依赖性。因此,如果删除在方法1或2中创建的表,则序列也会被删除。