`

PostgreSQL-01学习--表的定义&系统字段&表的修改&权限

阅读更多

出处:http://www.cnblogs.com/stephen-liu74/archive/2011/12/16/2290803.html

 

一、表的定义:

 

    对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。

    1. 创建表:

    CREATE TABLE products (

        product_no integer,

        name text,

        price numeric

    );

    

    2. 删除表:

    DROP TABLE products;

    

    3. 创建带有缺省值的表:

    CREATE TABLE products (

        product_no integer,

        name text,

        price numeric DEFAULT 9.99 --DEFAULT是关键字,其后的数值9.99是字段price的默认值。

    );

    

    CREATE TABLE products (

        product_no SERIAL,            --SERIAL类型的字段表示该字段为自增字段,完全等同于Oracle中的Sequence。

        name text,

        price numeric DEFAULT 9.99

    );

    输出为:

    NOTICE:  CREATE TABLE will create implicit sequence "products_product_no_seq" for serial column "products.product_no"

    

    4. 约束:

    检查约束是表中最为常见的约束类型,它允许你声明在某个字段里的数值必须满足一个布尔表达式。不仅如此,我们也可以声明表级别的检查约束。

    CREATE TABLE products (

        product_no integer,

        name text,

        --price字段的值必须大于0,否则在插入或修改该字段值是,将引发违规错误。还需要说明的是,该检查约束

        --是匿名约束,即在表定义时没有显示命名该约束,这样PostgreSQL将会根据当前的表名、字段名和约束类型,

        --为该约束自动命名,如:products_price_check。

        price numeric CHECK (price > 0) 

    );

  

    CREATE TABLE products (

        product_no integer,

        name text,

        --该字段的检查约束被显示命名为positive_price。这样做好处在于今后维护该约束时,可以根据该名进行直接操作。

        price numeric CONSTRAINT positive_price CHECK (price > 0) 

    );

    下面的约束是非空约束,即约束的字段不能插入空值,或者是将已有数据更新为空值。

    CREATE TABLE products (

        product_no integer NOT NULL,

        name text NOT NULL,

        price numeric

    );

    如果一个字段中存在多个约束,在定义时可以不用考虑约束的声明顺序。

    CREATE TABLE products (

        product_no integer NOT NULL,

        name text NOT NULL,

        price numeric NOT NULL CHECK (price > 0)

    );

    唯一性约束,即指定的字段不能插入重复值,或者是将某一记录的值更新为当前表中的已有值。

    CREATE TABLE products (

        product_no integer UNIQUE,

        name text,

        price numeric

    );

 

    CREATE TABLE products (

        product_no integer,

        name text,

        price numeric,

        UNIQUE (product_no)

    );

    为表中的多个字段定义联合唯一性。

    CREATE TABLE example (

        a integer,

        b integer,

        c integer,

        UNIQUE (a, c)

    );

    为唯一性约束命名。

    CREATE TABLE products (

        product_no integer CONSTRAINT must_be_different UNIQUE,

        name text,

        price numeric

    );

    在插入数据时,空值(NULL)之间被视为不相等的数据,因此对于某一唯一性字段,可以多次插入空值。然而需要注意的是,这一规则并不是被所有数据库都遵守,因此在进行数据库移植时可能会造成一定的麻烦。

    

    5. 主键和外键:

    从技术上来讲,主键约束只是唯一约束和非空约束的组合。

    CREATE TABLE products (

        product_no integer PRIMARY KEY,  --字段product_no被定义为该表的唯一主键。

        name text,

        price numeric

    );

    和唯一性约束一样,主键可以同时作用于多个字段,形成联合主键:

    CREATE TABLE example (

        a integer,

        b integer,

        c integer,

        PRIMARY KEY (b, c)

    );

    外键约束声明一个字段(或者一组字段)的数值必须匹配另外一个表中某些行出现的数值。 我们把这个行为称做两个相关表之间的参考完整性。

    CREATE TABLE orders (

        order_id integer PRIMARY KEY, --该表也可以有自己的主键。

        --该表的product_no字段为上面products表主键(product_no)的外键。

        product_no integer REFERENCES products(product_no), 

        quantity integer

    );

    

    CREATE TABLE t1 (

        a integer PRIMARY KEY,

        b integer,

        c integer,

        --该外键的字段数量和被引用表中主键的数量必须保持一致。

        FOREIGN KEY (b, c) REFERENCES example (b, c)

    );   

    当多个表之间存在了主外键的参考性约束关系时,如果想删除被应用表(主键表)中的某行记录,由于该行记录的主键字段值可能正在被其引用表(外键表)中某条记录所关联,所以删除操作将会失败。如果想完成此操作,一个显而易见的方法是先删除引用表中和该记录关联的行,之后再删除被引用表中的该行记录。然而需要说明的是,PostgreSQL为我们提供了更为方便的方式完成此类操作。

    CREATE TABLE products (

        product_no integer PRIMARY KEY,

        name text,

        price numeric

    );

    

    CREATE TABLE orders (

        order_id integer PRIMARY KEY,

        shipping_address text

    );

    

    CREATE TABLE order_items (

        product_no integer REFERENCES products ON DELETE RESTRICT, --限制选项

        order_id integer REFERENCES orders ON DELETE CASCADE, --级联删除选项

        quantity integer,

        PRIMARY KEY (product_no, order_id)

    );

    限制和级联删除是两种最常见的选项。RESTRICT 禁止删除被引用的行。 NO ACTION 的意思是如果在检查约束的时候,如果还存在任何引用行,则抛出错误; 如果你不声明任何东西,那么它就是缺省的行为。(这两个选择的实际区别是,NO ACTION 允许约束检查推迟到事务的晚些时候,而 RESTRICT 不行。) CASCADE声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。 在外键字段上的动作还有两个选项: SET NULL 和 SET DEFAULT。 这样会导致在被引用行删除的时候,引用它们的字段分别设置为空或者缺省值。 请注意这些选项并不能让你逃脱被观察和约束的境地。比如,如果一个动作声明 SET DEFAULT,但是缺省值并不能满足外键,那么动作就会失败。类似ON DELETE,还有ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的。可用的动作是一样的。

 

二、系统字段:

 

    PostgreSQL的每个数据表中都包含几个隐含定义的系统字段。因此,这些名字不能用于用户定义的字段名。这些系统字段的功能有些类似于Oracle中的rownum和rowid等。

    oid: 行的对象标识符(对象ID)。这个字段只有在创建表的时候使用了WITH OIDS,或者是设置了配置参数default_with_oids时出现。这个字段的类型是oid(和字段同名)。 

    tableoid: 包含本行的表的OID。这个字段对那些从继承层次中选取的查询特别有用,因为如果没有它的话,我们就很难说明一行来自哪个独立的表。tableoid可以和pg_class的oid字段连接起来获取表名字。 

    xmin: 插入该行版本的事务的标识(事务ID)。

    cmin: 在插入事务内部的命令标识(从零开始)。 

    xmax: 删除事务的标识(事务ID),如果不是被删除的行版本,那么是零。

    cmax: 在删除事务内部的命令标识符,或者是零。 

    ctid: 一个行版本在它所处的表内的物理位置。请注意,尽管ctid可以用于非常快速地定位行版本,但每次VACUUM FULL之后,一个行的ctid都会被更新或者移动。因此ctid是不能作为长期的行标识符的。    

    OID是32位的量,是在同一个集群内通用的计数器上赋值的。对于一个大型或者长时间使用的数据库,这个计数器是有可能重叠的。因此,假设OID是唯一的是非常错误的,除非你自己采取了措施来保证它们是唯一的。如果你需要标识表中的行,我们强烈建议使用序列号生成器。     

    

三、表的修改:

 

    1. 增加字段:

    ALTER TABLE products ADD COLUMN description text;

    新增的字段对于表中已经存在的行而言最初将先填充所给出的缺省值(如果你没有声明DEFAULT子句,那么缺省是空值)。

    在新增字段时,可以同时给该字段指定约束。

    ALTER TABLE products ADD COLUMN description text CHECK(description <> '');

    

    2. 删除字段:

    ALTER TABLE products DROP COLUMN description;

    如果该表为被引用表,该字段为被引用字段,那么上面的删除操作将会失败。如果要想在删除被引用字段的同时级联的删除其所有引用字段,可以采用下面的语法形式。

    ALTER TABLE products DROP COLUMN description CASCADE;

    

    3. 增加约束:

    ALTER TABLE products ADD CHECK(name <> '');  --增加一个表级约束

    ALTER TABLE products ADD CONSTRAINT some_name UNIQUE(product_no);--增加命名的唯一性约束。

    ALTER TABLE products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增加外键约束。

    ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; --增加一个非空约束。

    

    4. 删除约束:

    ALTER TABLE products DROP CONSTRAINT some_name;

    对于显示命名的约束,可以根据其名称直接删除,对于隐式自动命名的约束,可以通过psql的\d tablename来获取该约束的名字。和删除字段一样,如果你想删除有着被依赖关系地约束,你需要用CASCADE。一个例子是某个外键约束依赖被引用字段上的唯一约束或者主键约束。如:

    MyTest=# \d products

         Table "public.products"

       Column     |  Type   | Modifiers

     ------------+---------+-----------

     product_no | integer |

     name          | text    |

     price           | numeric |

     Check constraints:

        "positive_price" CHECK (price > 0::numeric)

    和其他约束不同的是,非空约束没有名字,因此只能通过下面的方式删除:

    ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

    

    5. 改变字段的缺省值:

    在为已有字段添加缺省值时,不会影响任何表中现有的数据行, 它只是为将来INSERT命令改变缺省值。

    ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

    下面为删除缺省值:

    ALTER TABLE products ALTER COLUMN price DROP DEFAULT

    

    6. 修改字段的数据类型:

    只有在字段里现有的每个项都可以用一个隐含的类型转换转换成新的类型时才可能成功。比如当前的数据都是整型,而转换的目标类型为numeric或varchar,这样的转换一般都可以成功。与此同时,PostgreSQL还将试图把字段的缺省值(如果存在)转换成新的类型, 还有涉及该字段的任何约束。但是这些转换可能失败,或者可能生成奇怪的结果。 在修改某字段类型之前,你最好删除那些约束,然后再把自己手工修改过的添加上去。 

    ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

       

    7. 修改字段名:

    ALTER TABLE products RENAME COLUMN product_no TO product_number;

    

    8. 修改表名:

    ALTER TABLE products RENAME TO items;

    

四、权限:

 

    只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。

    需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去。

    GRANT UPDATE ON table_name TO user;  --将表的更新权限赋予指定的user。

    GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组。

    REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销。

    最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"权限,这样就给接受权限的人以授予该权限给其它人的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都将失去该权限

 

分享到:
评论

相关推荐

    postgresql-10.1-3-windows-x64.zip

    6. **权限和角色**:理解PostgreSQL的权限系统,如GRANT和REVOKE命令,以及如何通过角色管理用户权限。 对于Odoo用户,以下几点也至关重要: 1. **模型和字段**:了解Odoo的模型设计,如字段类型、关系、行为...

    postgresql-9.5.5.tar.gz

    1. **数据定义**:使用CREATE TABLE语句创建数据库表,定义字段类型和约束,如主键、外键等。 2. **数据操纵**:INSERT语句用于向表中插入新记录,UPDATE用于修改已有记录,DELETE用于删除记录。 3. **数据查询**:...

    postgresql学习

    ### PostgreSQL 学习知识点 #### 一、基本操作命令 1. **表的基本操作** - **创建表**: `CREATE TABLE 表名 (字段名 数据类型, ...);` - 示例: `CREATE TABLE student (id INT, name VARCHAR(50));` - **删除表...

    PostgreSQL环境搭建及部署文档手册.docx

    ### PostgreSQL环境搭建及部署知识点详解 #### 一、PostgreSQL简介 **1.1 数据库特点** - **可靠性与稳定性**:PostgreSQL以其卓越的稳定性和可靠性著称,在处理复杂查询和大规模数据集时表现优异。 - **数据一致...

    postgreSQL安装,附带安装文档说明

    5. 表结构设计:使用SQL语句创建表,定义字段、数据类型、主键等。 6. 数据导入导出:pg_dump用于备份数据库,pg_restore恢复备份。 五、安全注意事项 - 定期更新PostgreSQL到最新版本,以获取安全补丁。 - 限制对...

    1.5-PostgreSQL对象-关系数据库系统软件.ppt

    PostgreSQL是一种开源的对象-关系数据库管理系统(ORDBMS),它以其强大的功能和高度的灵活性而闻名。本节将深入探讨PostgreSQL的基本特性、程序组成、客户端和服务器端程序、管理工具,以及数据库的主要对象。 ...

    PostgreSQL从菜鸟到专家

    本书《PostgreSQL从菜鸟到专家》是一本详尽的教程,旨在帮助读者从基础入手逐步掌握PostgreSQL这一强大的开源关系型数据库管理系统。本书由洞庭湖的泥鳅翻译,并提供详细的章节内容。 #### 第一章:PostgreSQL介绍 ...

    Postgresql编程教程(自学).docx_postgresql_

    - **表的创建**:使用`CREATE TABLE`语句定义表结构,包括字段名、数据类型和约束。 - **插入数据**:使用`INSERT INTO`语句向表中添加数据。 - **查询数据**:掌握`SELECT`语句,包括选择列、过滤结果、排序和分组...

    PostgreSQL Developer s Guide

    通过以上内容的学习,我们可以了解到PostgreSQL的强大功能及其在实际应用中的灵活运用。无论是基础的数据操作还是高级的过程语言编程,PostgreSQL都提供了丰富的工具和支持,使得开发者能够高效地构建复杂的应用程序...

    postgresqlAPI

    11. PostgreSQL的系统表和系统视图: - 介绍了系统表如`pg_class`、`pg_attrdef`等,系统视图如`pg_tables`、`pg_indexes`等,这些都是查询数据库内部信息的重要接口。 12. PostgreSQL的客户端命令: - `pg_dump`...

    postgresql

    1. **数据模型**:PostgreSQL基于关系数据模型,支持SQL标准,允许创建表、视图、索引等数据库对象,以及定义字段、主键、外键等约束。 2. **对象-关系特性**:PostgreSQL超越了传统的RDBMS,支持数组、XML、JSON、...

    PostgreSQL从入门到精通(

    - **选择列**:确定表中需要哪些字段。 - **数据类型**:如整数、字符串等。 - **唯一性标记**:确保每条记录的唯一性。 - **数据访问**:通过SQL语句从数据库检索数据。 - **多用户支持**:实现并发访问时的数据...

    Oracle向PostgreSQL移植实例

    - PostgreSQL中的字段长度定义只接受数字,不接受BYTE单位。 5. **序列**: - Oracle的序列在PostgreSQL中没有直接对应物,但可以通过创建序列和触发器来实现类似功能。 6. **索引与主键**: - Oracle的ALTER ...

    postgresql10数据库生成文档工具

    良好的数据库文档应包含表定义、字段信息、索引、视图、存储过程等。 3. **数据库表结构**:数据库表结构是数据库的核心组成部分,它定义了数据如何在表中组织。表结构包括表格名、字段名、数据类型、主键、外键、...

    POSTGRESQL7数据库开发指南

    创建表是数据库开发的关键步骤,涉及定义字段、数据类型、主键和外键。在PostgreSQL7中,可以使用CREATE TABLE语句创建表,ALTER TABLE用于修改表结构,DROP TABLE则用于删除表。 **5. 触发器与存储过程** 触发器是...

    PGAdmin系统管理PostgreSQL 中文手册

    例如,可以添加、删除或修改表的字段,创建索引以优化查询性能,定义视图来简化数据访问,或者编写存储过程和函数来封装复杂的业务逻辑。 **5. 用户与权限管理** pgAdmin提供了方便的用户和角色管理功能。可以创建...

    Postgresql大象数据库还原文件

    ### PostgreSQL 大象数据库还原与配置详解 #### 一、创建登录角色 在PostgreSQL中,登录角色(或用户)的创建是管理数据库的第一步。按照以下步骤进行操作: 1. **新建登录角色**:在PostgreSQL管理工具中右击...

    PostgreSQL教程(十五):系统表详解

    在PostgreSQL数据库中,系统表是用于存储数据库元数据的关键组成部分。这些元数据包含了关于数据库对象(如表、索引、用户、权限等)的信息。本教程将详细讲解几个重要的系统表,帮助你理解PostgreSQL如何管理和维护...

    postgresql中文手册9.1

    FOR VALUES FROM ('2020-01-01') TO ('2021-01-01'); ``` #### 数据类型 - **数值类型**:包括整数(如 `integer`)、浮点数(如 `real` 和 `double precision`)以及精确数字(如 `numeric` 和 `decimal`)。 -...

    PostgreSQL中文手册9.1

    PostgreSQL中文手册9.1为数据库开发者提供了一套全面的指南,涵盖了从基础的表创建到复杂系统表和视图的管理。本手册不仅可以帮助新手入门,也为经验丰富的数据库管理员提供了深入的参考资料。 表的定义是数据库...

Global site tag (gtag.js) - Google Analytics