Postgresql 有以下三种方法设置主键递增的方式,下面来看下相同点和不同点。
方法一
1 |
create table test_a |
方法二
1 |
create table test_b |
方法三
1 |
create table test_c |
很明显从上面可以看出,方法一和方法二只是写法不同,实质上主键都通过使用 serial 类型来实现的,使用serial类型,PG会自动创建一个序列给主键用,当插入表数据时如果不指定ID,则ID会默认使用序列的 NEXT值。方法三是先创建一张表,再创建一个序列,然后将表主键ID的默认值设置成这个序列的NEXT值。这种写法似乎更符合人们的思维习惯,也便于管理,如果系统遇到sequence 性能问题时,便于调整 sequence 属性;
比较三张表的表结构
skytf=> /d test_a
Table "skytf.test_a"
Column | Type | Modifiers
--------+------------------------+-----------------------------------------------------
id | integer | not null default nextval('test_a_id_seq'::regclass)
name | character varying(128) |
Indexes:
"pk_test_a_id" PRIMARY KEY, btree (id)
skytf=> /d test_b
Table "skytf.test_b"
Column | Type | Modifiers
--------+------------------------+-----------------------------------------------------
id | integer | not null default nextval('test_b_id_seq'::regclass)
name | character varying(128) |
Indexes:
"test_b_pkey" PRIMARY KEY, btree (id)
skytf=> /d test_c
Table "skytf.test_c"
Column | Type | Modifiers
--------+------------------------+-----------------------------------------------------
id | integer | not null default nextval('test_c_id_seq'::regclass)
name | character varying(128) |
Indexes:
"test_c_pkey" PRIMARY KEY, btree (id)
从上面可以看出,三个表表结构一模一样, 三种方法如果要寻找差别,可能仅有以下一点,当 drop 表时,方法一和方法二会自动地将序列也 drop 掉,而方法三不会。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/236363.html