Postgresql 创建主键并设置自动递增的三种方法

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 掉, 而方法三不会。
当使用ora2pg工具的-disable_sequence选项时,ora2pg将不会转换数据库中的序列(sequences),而是在导出的SQL脚本中生成一个空序列。 下面是一个示例,假设我们有一个名为"employees"的表,其中包含一个名为"employee_id_seq"的序列,我们可以使用以下命令将该表导出为SQL脚本: ``` ora2pg -disable_sequence 1 -t employees -o employees.sql -c config_file.conf ``` 在这个示例中,我们使用-disable_sequence 1选项禁用了序列的转换。导出的SQL脚本中将包含以下内容: ``` -- Create sequence employee_id_seq CREATE SEQUENCE employee_id_seq; -- Create table employees CREATE TABLE employees ( employee_id NUMBER(6) NOT NULL, first_name VARCHAR2(20), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25) NOT NULL, phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- Add primary key constraint ALTER TABLE employees ADD CONSTRAINT emp_employee_id_pk PRIMARY KEY (employee_id); -- Add foreign key constraint ALTER TABLE employees ADD CONSTRAINT emp_department_id_fk FOREIGN KEY (department_id) REFERENCES departments (department_id); -- Add foreign key constraint ALTER TABLE employees ADD CONSTRAINT emp_job_id_fk FOREIGN KEY (job_id) REFERENCES jobs (job_id); -- Add foreign key constraint ALTER TABLE employees ADD CONSTRAINT emp_manager_id_fk FOREIGN KEY (manager_id) REFERENCES employees (employee_id); ``` 可以看到,在导出的SQL脚本中,创建了一个空的序列"employee_id_seq",而不是转换实际的序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值