4.4 表

4.4.1 创建表

  1. 最简单的建表语句:

    CREATE TABLE 表名 (
    	列名 类型 PRIMARY KEY,
        列名 类型,
        列名 类型,
        ... ...
    )

    备注:

    PRIMARY KEY:表示主键

  2. 复合主键

    CREATE TABLE 表名(
    	列名1 类型,
        列名2 类型,
        列名3 类型,
        CONSTRAINT pk_表名 PRIMARY KEY (列名1, 列名2)
    )

    备注:pk_表名:表示给复合主键设置一个名,命名格式建议是这个样子

  3. 指定唯一可以使用UNIQUE关键字指定

    CREATE TABLE 表名(
    	列名1 类型,
        列名2 类型,
        列名3 类型,
        CONSTRAINT pk_表名 PRIMARY KEY(列名1, 列名2),
        CONSTRAINT uk_表名_列名 UNIQUE(列名3)
    )

    备注:CONSTRAINT uk_表名_列名 UNIQUE(列名3):表示给列名3设置唯一,内容同样为建议命名规范

  4. 条件关键字

    CONSTRAINT ck_表名_列名 CHECK(条件)

    备注:比如年龄不能小于18

    CREATE TABLE user (
    	id int PRIMARY KEY,
        name varchar,
        age int,
        CONSTRAINT ck_user_age CHECK(age > 18)
    )
  5. 使用其他表为模板创建表

    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 临时表

  1. PostgreSQL仅支持两种临时表,一种会话级临时表,一种事务级临时表

  2. 临时表当会话结束之后,也会消失

  3. 如果在两个不同的session中创建两个相同的临时表,实际上是创建了两个不同的表

  4. 创建临时表

    CREATE TEMPORARY TABLE 表名 (
    	列名  类型,
        列名  类型,
        ...  ...
    )

4.4.3 UNLOGGED表

  1. UNLOGGED表是从PostgreSQL9.1版本开始新增的一种表,主要是通过禁止产生WAL日志的方式提升写性能。因为没有WAL日志,所以表的内容无法在主备库直接同步,如果此时数据库异常宕机,表的内容将丢失,所以可以把UNLOGGED表称为“半临时表”。当然如果数据库是正常关机的,则UNLOGGED表的内容不会丢失。

  2. 创建语句

    CREATE UNLOGGED TABLE 表名 (
    	列名  类型,
        列名  类型,
        ...  ...
    )

4.4.4 默认值

  1. 建表时候,给字段设置默认值,插入时未设置这个字段,则使用默认值插入

    CREATE TABLE 表名 (
    	列名 类型,
        列名 类型 DEFAULT 值,
        列名 类型,
        ... ...
    )

    备注:如果没有设置默认值,默认的时候为NULL

  2. 默认插入时间,可以使用now()设置默认值

4.4.5 约束

建表时候,给列内容设置约束,保证数据安全与稳定性,约束具体分类如下:

  • 检查约束

  • 非空约束

  • 唯一约束

  • 主键

  • 外键约束

  1. 检查约束

    1. 使用时候必须保证数值使约束表达式为真

      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是在设置约束名

      也可以设置表约束

  2. 非空约束

    1. 简单声明不是空,在字段后面添加NOT NULL即可

    2. 检查约束时,需要使用IS NOT NULL

  3. 唯一约束

    1. 唯一约束关键字:UNIQUE

    2. 两种设置方案:

      CREATE TABLE 表名(
      	id int UNIQUE,
          book_no int,
          name varchar,
          UNIQUE(book_no)
      )

      备注:

      方案1:直接在字段后添加关键字

      方案2:字段设置结束后统一设置

  4. 主键:

    1. 关键字:PRIMARY KEY

      CREATE TABLE 表名(
      	id int PRIMARY KEY,
          book_no int,
          name varchar,
          CONSTRAINT pk_表名 PRIMARY KEY (id)
      )

      备注:两种设置方案

  5. 外键约束

    1. 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命令来实现,可执行操作如下:

  • 增加字段

  • 删除字段

  • 增加约束

  • 删除约束

  • 修改默认值

  • 删除默认值

  • 修改字段数据类型

  • 重命名字段

  • 重命名表

  1. 增加字段

    ALTER TABLE 表名 ADD COLUMN 列名 类型 [CHECK(列名 IS NOT NULL)];

    备注:

    如果列已存在,则添加默认值,原有默认值,则设置为NULL

    也可以设置约束

  2. 删除字段

    ALTER TABLE 表名 DROP COLUMN 列名;

    如果字段被其他表关联外键,则必定报错,删除时候顺便删除其他标的外键:

    ALTER TABLE 表名 DROP COLUMN 列名 CASCADE;
  3. 增加约束

    ALTER TABLE 表名 ADD CHECK(约束内容);

    注意:表内已有数据必须满足条件,不然报错!!!

  4. 删除约束

    ALTER TABLE 表名 DROP CONSTRAINT 约束名;

    备注:一般使用\d 表名来查询约束名称

    非空约束没有名称,需要用下面的方式来删除

    ALTER TABLE 表名 ALTER COLUMN 字段名 DROP NOT NULL;
  5. 修改默认值

    ALTER TABLE 表名 ALTER COLUMN 字段 SET DEFAULT 值;
  6. 删除默认值

    ALTER TABLE 表名 ALTER COLUMN 字段 DROP DEFAULT;

    备注:也是就是将默认值设置为NULL

  7. 修改字段数据类型

    ALTER TABLE 表名 ALTER COLUMN 字段 TYPE 类型;

    备注:注意类型转换

  8. 重命名字段

    ALTER TABLE 表名 RENAME COLUMN 字段名 TO 新字段名;
  9. 重命名表

    ALTER TABLE 表名 RENAME TO 新表名;

4.4.7 表继承

  1. 定义父表

    CREATE TABLE person (
    	name text,
        age int,
        sex boolean
    )
  2. 定义子表,继承父表

    CREATE TABLE student (
    	class_no int
    ) INHERITS (person)

    备注:相当于子表字段同时包含person表的字段,又添加了student的字段

  3. 向子表插入数据的时候是正常全字段插入

  4. 向父表插入字段时,子表不添加;向子表添加字段时,父表也添加

  5. 修改父表字段与类型时,子表也会被修改

最后更新于