zoukankan      html  css  js  c++  java
  • 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 掉, 而方法三不会。

  • 相关阅读:
    Minimum Path Sum,最短路径问题,动态规划
    UniquePaths,UniquePaths2,路径问题。动态规划。
    LengthOfLastWord,字符串最后一个子串的长度
    间隔问题,合并间隔(merge interval),插入间隔(insert interval)
    矩阵螺旋遍历Spiral Matrix,Spiral Matrix2
    Centos 5.2 下配置 php 的 json 扩展
    一个睡五分钟等于六个钟头的方法
    js div 排除内部的点击事件 就是 冒泡的处理
    做微信开发 “人脉圈的” 总结
    YII 学习笔记
  • 原文地址:https://www.cnblogs.com/huanjianlin/p/3066686.html
Copyright © 2011-2022 走看看