PostgreSQL基础知识--表的约束,修改与权限
一,表的约束
1. 检查约束
是表中最为常见的约束类型,它允许你声明在某个字段里的数值必须满足一个布尔表达式。


为检查约束指定名称

2. 非空约束
即约束的字段不能插入空值,或者将以有数据更新为空值
3. 唯一性约束
即指定的字段不能插入重复值,或者是将某一记录的值更新为当前表中的已有值

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

为唯一性约束命名

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



二,主键和外键
1. 主键约束: 只是唯一约束和非空约束的组合

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

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


外键的字段可以插入null

例1:

例2:

例3:

例4:

例5:

例6:

例7:

总结:
单个外键, 只能对应另一个表的主键,或者唯一性约束字段
联合外键, 只能对应另一个表的联合主键,并且联合外键的字段数量和联合主键的字段数量必须保持一致。
(2). 当删除被引用行或者更新被引用列时,对于引用表或引用列,不同的action有不同的行为。
可用的action如下:
NO ACTION
如果违反外键约束会产生一个错误。如果约束被延迟,那么到事务结束检查约束时如果仍然因为存在一个引用行而违反外键约束,则仍会产生错误。这是默认值。其他的动作action都不能被延迟。
RESTRICT
违反外键约束会产生一个错误。
CASCADE
级联删除或更新。分别删除一个引用行或者更新一个引用列的值。
SET NULL
设置引用列(referencing column(s))的值为null
SET DEFAULT
设置引用列为其缺省值。如果缺省值不是null,那么仍然需要被引用表中有一条记录的被引用字段的值与之匹配,否则操作会失败。

准备数据:

on delete restrict: 被引用的行禁止删除;

on update restrict: 被引用的行禁止更新;


on update cascade: 被引用行更新时,引用行自动更新;



on delete cascade: 被引用行删除时,引用行也一起删除;


二,表的修改
1. 增加字段

2. 删除字段

如果该表为引用表,该字段为被引用字段,那么上面的删除操作将会失败。

想要删除被引用字段的同时,级联的删除其所有引用字段。

关联表的外键被删除

3. 增加约束


4. 删除约束

对于隐式自动命名的约束,可以通过psql的\d tablename来获取该约束的名字。


5. 改变字段的缺省值

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

将integer类型修改为varchar



7. 修改字段名

8. 修改表名

三,权限
只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。需要指出的是,PUBLIC是特殊“用户”。可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL,则将所有的与对象类型相关的权限都赋予出去。

最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"权限,这样就可以给接受权限的人以“授予该权限给其他人”的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都会失去该权限。
文章内容来自:https://www.cnblogs.com/orangeform/archive/2012/04/23/2290803.html