4.4 表
4.4.1 创建表
最简单的建表语句:
CREATE TABLE 表名 ( 列名 类型 PRIMARY KEY, 列名 类型, 列名 类型, ... ... )备注:
PRIMARY KEY:表示主键复合主键
CREATE TABLE 表名( 列名1 类型, 列名2 类型, 列名3 类型, CONSTRAINT pk_表名 PRIMARY KEY (列名1, 列名2) )备注:
pk_表名:表示给复合主键设置一个名,命名格式建议是这个样子指定唯一可以使用
UNIQUE关键字指定CREATE TABLE 表名( 列名1 类型, 列名2 类型, 列名3 类型, CONSTRAINT pk_表名 PRIMARY KEY(列名1, 列名2), CONSTRAINT uk_表名_列名 UNIQUE(列名3) )备注:
CONSTRAINT uk_表名_列名 UNIQUE(列名3):表示给列名3设置唯一,内容同样为建议命名规范条件关键字
CONSTRAINT ck_表名_列名 CHECK(条件)备注:比如年龄不能小于18
CREATE TABLE user ( id int PRIMARY KEY, name varchar, age int, CONSTRAINT ck_user_age CHECK(age > 18) )使用其他表为模板创建表
CREATE TABLE 表名 ( LIKE 模板表名 [是否复制其他约束信息] )备注:复制约束信息,可以使用
INCLUDING关键字INCLUDING DEFAULTS:INCLUDING CONSTRAINTS:INCLUDING INDEXES:INCLUDING STORAGE:INCLUDING COMMENTS:INCLUDING ALL:复制全部属性复制其他表的方式也可以使用如下方式:
CREATE TABLE 表名 AS SELECT * FROM 模板表名 WITH NO DATA;
4.4.2 临时表
PostgreSQL仅支持两种临时表,一种会话级临时表,一种事务级临时表
临时表当会话结束之后,也会消失
如果在两个不同的session中创建两个相同的临时表,实际上是创建了两个不同的表
创建临时表
CREATE TEMPORARY TABLE 表名 ( 列名 类型, 列名 类型, ... ... )
4.4.3 UNLOGGED表
UNLOGGED表是从PostgreSQL9.1版本开始新增的一种表,主要是通过禁止产生WAL日志的方式提升写性能。因为没有WAL日志,所以表的内容无法在主备库直接同步,如果此时数据库异常宕机,表的内容将丢失,所以可以把UNLOGGED表称为“半临时表”。当然如果数据库是正常关机的,则UNLOGGED表的内容不会丢失。
创建语句
CREATE UNLOGGED TABLE 表名 ( 列名 类型, 列名 类型, ... ... )
4.4.4 默认值
建表时候,给字段设置默认值,插入时未设置这个字段,则使用默认值插入
CREATE TABLE 表名 ( 列名 类型, 列名 类型 DEFAULT 值, 列名 类型, ... ... )备注:如果没有设置默认值,默认的时候为
NULL默认插入时间,可以使用
now()设置默认值
4.4.5 约束
建表时候,给列内容设置约束,保证数据安全与稳定性,约束具体分类如下:
检查约束
非空约束
唯一约束
主键
外键约束
检查约束
使用时候必须保证数值使约束表达式为真
CREATE TABLE 表名 ( id int, name varchar(32) NOT NULL, age int CONSTRAINT check_age CHECK(age >= 0 AND age <= 150), sex boolean, CHECK(sex IS NOT NULL) )备注:age范围在0到150
CONSTRAINT check_age是在设置约束名也可以设置表约束
非空约束
简单声明不是空,在字段后面添加
NOT NULL即可检查约束时,需要使用
IS NOT NULL
唯一约束
唯一约束关键字:
UNIQUE两种设置方案:
CREATE TABLE 表名( id int UNIQUE, book_no int, name varchar, UNIQUE(book_no) )备注:
方案1:直接在字段后添加关键字
方案2:字段设置结束后统一设置
主键:
关键字:
PRIMARY KEYCREATE TABLE 表名( id int PRIMARY KEY, book_no int, name varchar, CONSTRAINT pk_表名 PRIMARY KEY (id) )备注:两种设置方案
外键约束
REFERENCES 外键表(外键表列)CREATE TABLE class( class_no int primary key, class_name varchar(40) ); CREATE TABLE student( student_no int primary key, student_name varchar(40), age int, class_no int REFERENCES class(class_no) );
4.4.6 修改表
修改表主要通过ALTER TABLE命令来实现,可执行操作如下:
增加字段
删除字段
增加约束
删除约束
修改默认值
删除默认值
修改字段数据类型
重命名字段
重命名表
增加字段
ALTER TABLE 表名 ADD COLUMN 列名 类型 [CHECK(列名 IS NOT NULL)];备注:
如果列已存在,则添加默认值,原有默认值,则设置为
NULL也可以设置约束
删除字段
ALTER TABLE 表名 DROP COLUMN 列名;如果字段被其他表关联外键,则必定报错,删除时候顺便删除其他标的外键:
ALTER TABLE 表名 DROP COLUMN 列名 CASCADE;增加约束
ALTER TABLE 表名 ADD CHECK(约束内容);注意:表内已有数据必须满足条件,不然报错!!!
删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名;备注:一般使用
\d 表名来查询约束名称非空约束没有名称,需要用下面的方式来删除
ALTER TABLE 表名 ALTER COLUMN 字段名 DROP NOT NULL;修改默认值
ALTER TABLE 表名 ALTER COLUMN 字段 SET DEFAULT 值;删除默认值
ALTER TABLE 表名 ALTER COLUMN 字段 DROP DEFAULT;备注:也是就是将默认值设置为NULL
修改字段数据类型
ALTER TABLE 表名 ALTER COLUMN 字段 TYPE 类型;备注:注意类型转换
重命名字段
ALTER TABLE 表名 RENAME COLUMN 字段名 TO 新字段名;重命名表
ALTER TABLE 表名 RENAME TO 新表名;
4.4.7 表继承
定义父表
CREATE TABLE person ( name text, age int, sex boolean )定义子表,继承父表
CREATE TABLE student ( class_no int ) INHERITS (person)备注:相当于子表字段同时包含person表的字段,又添加了student的字段
向子表插入数据的时候是正常全字段插入
向父表插入字段时,子表不添加;向子表添加字段时,父表也添加
修改父表字段与类型时,子表也会被修改
最后更新于