【问题标题】:Syntax of creating sequence and auto increment fields in PostgreSQL for the given table在 PostgreSQL 中为给定表创建序列和自增字段的语法
【发布时间】:2014-01-18 13:09:16
【问题描述】:

我是 PostgreSQL 的新手。我正在尝试找出创建下表的语法。
我在创建序列和自动增量字段时遇到了困难。

    Column    |         Type          |                      Modifiers
--------------+-----------------------+-----------------------------------------------------
 id_numuser   | integer               | not null default nextval('id_numuser_seq'::regclass)
 username     | character varying(70) |
 completename | character varying(70) |
 id_cat       | integer               |
 email        | character varying(70) |
 password     | character varying(30) |
 active       | boolean               |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id_numuser)
    "taskuser_uniq" UNIQUE, btree (username)
Foreign-key constraints:
    "users_id_cat_fkey" FOREIGN KEY (id_cat) REFERENCES usercategories(id_numcat)

【问题讨论】:

    标签: database postgresql database-design sequence create-table


    【解决方案1】:

    使用serial 列。详情看这里:
    Auto increment SQL function

    完整脚本:

    CREATE TABLE users (
       id_numuser   serial PRIMARY KEY
      ,username     character varying(70) UNIQUE
      ,completename character varying(70)
      ,id_cat       integer REFERENCES usercategories(id_numcat)
      ,email        character varying(70) 
      ,password     character varying(30) 
      ,active       boolean
    );
    

    您可以使用pgAdmin 为所有对象获取完整的逆向工程 SQL 脚本。

    另外:我建议只使用text 而不是varchar(n)

    【讨论】:

    • 谢谢,,,,但是我想知道创建这个表的完整语法。这将有助于创建其他表。再次感谢....
    • @user3001418:添加了完整的脚本。
    【解决方案2】:

    如果您对如何定义某事有疑问,pg_dump 会有所帮助。

    pg_dump -t 'users' --schema-only
    

    将打印一个转储文件,其中显示创建 users 表的命令。

    它不会使用像SERIAL 这样的简写,所以它会创建序列,然后分配序列所有权并设置列默认值。所以有时有一种比pg_dump 更短更简单的方法。不过,pg_dump 的方式将始终有效。

    在这种情况下,它产生(修剪):

    CREATE TABLE users (
        id_numuser integer NOT NULL,
        username character varying(70),
        completename character varying(70),
        id_cat integer,
        email character varying(70),
        password character varying(30),
        active boolean
    );
    
    CREATE SEQUENCE users_id_numuser_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
    
    ALTER SEQUENCE users_id_numuser_seq OWNED BY users.id_numuser;
    
    ALTER TABLE ONLY users ALTER COLUMN id_numuser 
    SET DEFAULT nextval('users_id_numuser_seq'::regclass);
    
    ALTER TABLE ONLY users
    ADD CONSTRAINT users_pkey PRIMARY KEY (id_numuser);
    
    ALTER TABLE ONLY users
    ADD CONSTRAINT users_username_key UNIQUE (username);
    
    ALTER TABLE ONLY users
    ADD CONSTRAINT users_id_cat_fkey FOREIGN KEY (id_cat) REFERENCES usercategories(id_numcat);
    

    所以它在创建基表之后定义序列和所有约束,而不是它的一部分,它指定了一堆通常会默认设置的东西。

    效果是一样的,如果你愿意,你可以这样做。 像SERIAL PRIMARY KEY 这样的东西基本上只是方便的速记。所有这些都在the documentation for CREATE TABLE 中得到了很好的介绍,所以一旦你知道你想要什么,你通常可以很容易地弄清楚如何定义它。大多数时候,你可以在ALTER TABLE ... ADD ... 中写的任何东西都可以在CREATE TABLE (...) 中写成一样的,例如:

    ALTER TABLE ONLY users
    ADD CONSTRAINT users_id_cat_fkey FOREIGN KEY (id_cat) REFERENCES usercategories(id_numcat);
    

    可以在创建时完成:

    CREATE TABLE users (
        ....,
        CONSTRAINT users_id_cat_fkey FOREIGN KEY (id_cat) REFERENCES usercategories(id_numcat)
    );
    

    此外,对于任何特定于列的CONSTRAINT,通常有一种方法可以将其附加到列定义的末尾。在这种情况下,您省略了CONSTRAINT constraint_name(它已生成)和FOREIGN KEY (id_cat)(因为该列是隐含的,您不需要指定它),并编写:

    CREATE TABLE users (
         ....
         id_cat integer REFERENCES usercategories(id_numcat),
         ....
    );
    

    一旦您知道要在 CREATE TABLE 文档中查找什么,通常很容易找到如何编写您想要的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 2015-08-17
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2018-12-31
      • 2014-08-30
      • 2017-04-01
      相关资源
      最近更新 更多