Postgresql 创建主键并设置自动递增的三种方法
2014-01-13 11:26
567 查看
Postgresql 有以下三种方法设置主键递增的方式,下面来看下相同点和不同点。
--方法一
create table test_a
(
id serial,
name character varying(128),
constraint pk_test_a_id primary key( id)
);
NOTICE: CREATE TABLE will create implicit sequence "test_a_id_seq" for serial column "test_a.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_a_id" for table "test_a"
CREATE TABLE
--方法二
create table test_b
(
id serial PRIMARY KEY,
name character varying(128)
);
NOTICE: CREATE TABLE will create implicit sequence "test_b_id_seq" for serial column "test_b.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_b_pkey" for table "test_b"
CREATE TABLE
--方法三
create table test_c
(
id integer PRIMARY KEY,
name character varying(128)
);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_c_pkey" for table "test_c"
CREATE TABLE
CREATE SEQUENCE test_c_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
alter table test_c alter column id set default nextval('test_c_id_seq');
很明显从上面可以看出,方法一和方法二只是写法不同,实质上主键都通过使用 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 掉, 而方法三不会。
--方法一
create table test_a
(
id serial,
name character varying(128),
constraint pk_test_a_id primary key( id)
);
NOTICE: CREATE TABLE will create implicit sequence "test_a_id_seq" for serial column "test_a.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_a_id" for table "test_a"
CREATE TABLE
--方法二
create table test_b
(
id serial PRIMARY KEY,
name character varying(128)
);
NOTICE: CREATE TABLE will create implicit sequence "test_b_id_seq" for serial column "test_b.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_b_pkey" for table "test_b"
CREATE TABLE
--方法三
create table test_c
(
id integer PRIMARY KEY,
name character varying(128)
);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_c_pkey" for table "test_c"
CREATE TABLE
CREATE SEQUENCE test_c_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
alter table test_c alter column id set default nextval('test_c_id_seq');
很明显从上面可以看出,方法一和方法二只是写法不同,实质上主键都通过使用 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 掉, 而方法三不会。
相关文章推荐
- Postgresql 创建主键并设置自动递增的三种方法
- Postgresql 创建主键并设置自动递增的三种方法
- Postgresql 创建主键并设置自动递增的三种方法
- Postgresql 创建主键并设置自动递增的三种方法
- 创建主键的三种方法
- mysql 的 比如主键的自动递增的初始值的改变和 设置
- idea创建新的类(文件)时,自动添加作者创建时间(文件注释)等信息的设置方法
- PowerDesigner设置MYSQL主键自动增长的方法
- 三种获得自动生成主键的方法
- postgreSQL怎样创建一个序列号/自动递增的字段
- 三种获得自动生成主键的方法,getGeneratedKeys,专用SQL和可更新的结果集
- 2016/3/10 数据库简单操作( 创建数据库 创建表 数值类型 主键 外键 自动递增 )
- 创建一个自增的数据库表的方法,并且设置为主键的方法
- PowerDesigner设置MYSQL主键自动增长的方法
- 开机默认设置一个widge在指定的屏幕上和自动在桌面上创建一个应用的快捷方式的方法
- sqlserver 2008 设置 主键自动递增
- powerdesigner创建oracle 数据库表,设置表主键列为自动增长。 .
- PowerDesigner设置MYSQL主键自动增长的方法
- oracle设置主键自动递增(建表_建序列_建触发器_测试),取序列值
- Eclipse4.7基础 在创建类的时候,进行设置自动实现抽象父类的所有抽象方法