PostgreSQL学习手册(数据表)

一、表的定义:

    对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。
    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中文文档,如转载本系列博客,请同样注明该出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

织梦联动类别-地区调用不显示第三级城市的解决方法

织梦联动类别-地区调用不显示第三级城市的原因 1、附加表dede_addoninfos 或者 你的其他表中的字段nativeplace数据类型为int型&#xff0c;无法保存第三级城市对应的的evalue值(比如&#xff1a;东山区 对应的 10001.001) 2、枚举表dede_sys_enum中的第三级城市对应evalue值…

js 随机1-10随机数_寻找随机的错误-一个真实的故事

js 随机1-10随机数几周前&#xff0c;我完成了RapidFTR开源项目的错误查找 &#xff0c;这花了我三个晚上。 我认为可能值得分享狩猎的故事。 本文将介绍我的工作。 我将概述我的旅程&#xff0c;以便真正找到正在发生的事情的根本原因。 我在本文中的目标是突出显示可以使用的…

用python写九九乘法口诀表左上角_python打出九九乘法口诀表

用IDLE打出乘法口诀表&#xff0c;想要就是如下图的结果&#xff1a;实现算法很简单&#xff0c;但是IDLE(python3.7)默认的换行输出方式不太容易实现&#xff0c;得需费一番脑筋。代码如下&#xff1a;*row0 #设置行数&#xff0c;值为1时候…

设计模式(一)Chain Of Responsibility责任链模式

设计模式篇章&#xff0c;源于网课的学习&#xff0c;以及个人的整理 在我们接收用户提交的字符时&#xff0c;常常会使用到过滤&#xff0c;在学习责任链模式前&#xff0c;我们是这样做的 1.定义一个类 public class MsgProcesser {String msg;public MsgProcesser(String ms…

如果你是IT技术人员,请思考这15个问题

行内的人自嘲是程序猿、屌丝和码农&#xff0c;行外的人也经常拿IT人调侃&#xff0c;那么究竟是IT人没有价值&#xff0c;还是没有仔细思考过自身的价值&#xff1f; 1.搞IT的是屌丝、码农、程序猿&#xff1f; 人们提到IT人的时候&#xff0c;总会想到他们呆板、不解风情&…

在Windows上运行-XX:CompileCommand

HotSpot JVM提供了几个与即时 &#xff08; JIT &#xff09;编译有关的命令行参数。 在本文中&#xff0c;我介绍了开始应用命令行标志-XX&#xff1a;CompileCommand所需的步骤&#xff0c;以查看对单个方法执行的即时编译。 JIT概述 Nikita Salnikov-Tarnovski的博客文章您…

匹配中文字符的正则表达式: [u4e00-u9fa5](

匹配双字节字符(包括汉字在内)&#xff1a;[^x00-xff]评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符长度计2&#xff0c;ASCII字符计1&#xff09;匹配空白行的正则表达式&#xff1a;ns*r评注&#xff1a;可以用来删除空白行匹配HTML标记的正则表达式&…

python define function的顺序_Python怎么根据一个函数来决定列表顺序

def__init__(self,function):self._queue[]self.functionfunction然后要写一往列表里增加元素的方法&#xff0c;按照function排序&#xff0c;function类型为函数defadd(self,item):"""AddtothisP...def __init__(self,function):self._queue []self.function…

excel单元格内容合并

这几天在整理数据&#xff0c;有时候数据都在表格的不同单元格中&#xff0c;想把两格内容合并为一格&#xff0c;于是验证了两种方法方法一:(1)在B1输入公式A1&B1(2)做完第一步后,选中B1后,鼠标移到单元格右下出现“”符号是下拉,就能得到结果,如图:方法二(1)在B1输入公式…

主分区与逻辑分区的区别

硬盘分区有三种&#xff0c;主磁盘分区、扩展磁盘分区、逻辑分区。 一个硬盘可以有一个主分区&#xff0c;一个扩展分区&#xff0c;也可以有一个主分区和若干逻辑分区。&#xff08;图1为大家最常见硬盘分区类型&#xff09; 主分区 主分区是硬盘的启动分区&#xff0c…

wxpython图形编程_wxpython  图像编程

1)目前遇到一个问题&#xff0c;就是wxpython显示一个图片&#xff0c;然后可以在图片上画矩形&#xff0c;点&#xff0c;line&#xff0c;circle and soon&#xff0c;最后保存矩形的坐标.但是现在可以在屏幕上画矩形&#xff0c;无法在图片上做标记&#xff0c;我反思的原因…

如何利用火狐获取网址中的提交链接

1、添加firebugz组件 2、用火狐打开你要的获取链接的网址例如 http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/jdtj/jdcjpm/index.html 3、按F12 4、点击你查询的按钮如点击如图下中的年月然后在firebug上点击网络获取里面的post链接 5、点击HTML 中的一个post &#xf…

python-22 eval json pickle shelve 之间差别

1.eval:可以转化字符串&#xff0c;字典&#xff0c;元组&#xff0c;列表等一般类型&#xff0c;不能转化类&#xff0c;函数 2.json:可以转化一般类型外&#xff0c;还可转化函数&#xff0c;可以在任何语言间转化&#xff0c;转化为字符串&#xff0c;可以写入文本&#xff…

打破冷漠僵局文章_研究僵局–第1部分

打破冷漠僵局文章我敢肯定我们都去过那里&#xff1a;太晚了&#xff0c;您饿了&#xff0c;您的服务器已挂起&#xff0c;或者您的应用程序正在以蜗牛的速度运行&#xff0c;并且有人喘着粗气想要您解决问题&#xff0c;然后再去解决。 您的应用程序意外挂起的可能原因之一是称…

vs2008下设置.h, .lib和 .dll 的路径配置全图及其意义

文件夹: 类型文件 include: .h &#xff08;头文件&#xff09; lib: .lib &#xff08;库&#xff09; 前面二者在vs2008中通过属性来配置。 bin: .dll &#xff08;动态链接库&#xff09; 动态链接库是通过系统路径来配置的。 添加库&#xff08;libs&#xff09;文件目录 …

按键精灵调用迅雷下载文件

Set ThunderAgent CreateObject("ThunderAgent.Agent") 建立迅雷接口对象ThunderAgent.AddTask "http://10.10.10.10/电影世界/12新电影/随风而逝.rmvb", "随风而逝.rmvb", "", "", "", - 1 , 0, - 1 Ca…

POJ1821 Fence

传送门 这道题是一道很好的单调队列优化DP的例子。 题目大意是有n个工人&#xff0c;每个人可以粉刷一段长度不超过l[i]的墙&#xff0c;如果一个人粉刷了那么他必须要粉刷第s[i]块墙&#xff0c;一个人粉刷一块墙能得到p[i]的钱&#xff0c;求所有工人得到的钱的最大值。 我们…

使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架&#xff0c;可节省开发人员的大量时间和精力。 此外&#xff0c;它还具有足够的灵活性&#xff0c;可以自定义并满足您的需求。 使用JDBC和Spring Security非常容易&#xff0c;并且许多操作是自动化的。 这将是一个最小的展示。 gradle文件包含…

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈&#xff0c;Spring框架的循环依赖如何解决。我收到了不少粉丝的提问&#xff0c;在了解到之后&#xff0c;也去网上查询了一些资料&#xff0c;自己也询问了身边的同事&#xff0c;总结出以下几个方面&#xff0c;今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载&#xff0c;为我们获取互联网资料提供了一个强有力的工具&#xff0c;它可以争取最大的带宽&#xff0c;获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等&#xff0c;后来许多传统“多线程断点续传类”软件&#xff0c;也增加了对的支持&#xff0c;…