Lin Hong's TECH Blog! 刀不磨要生锈,人不学习要落后 - Thinking ahead

Postgresql CHECK Study 008 Tips

2020-09-01

Postgresql CHECK Study 008 Tips

Postgresql CHECK 约束

简单字段 CHECK 约束

指定某列需要满足一定条件(true)

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

check 约束语法跟 default 默认值的写法一样放在列类型后面

check 约束和 default 默认值的顺序没有前后之分

指定名字 CHECK 约束

CHECK 约束名可以指定特定名字,没有指定的话,系统会自动分配一个名字,如下指定positive_price名称:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CONSTRAINT positive_price CHECK (price > 0)
);

查看表那些列有check约束,如下没有指定constraint具体名称,系统分配了products_price_check的check名称约束

postgres=# \d products
                Table "public.products"
   Column   |  Type   | Collation | Nullable | Default
------------+---------+-----------+----------+---------
 product_no | integer |           |          |
 name       | text    |           |          |
 price      | numeric |           |          |
Check constraints:
    "products_price_check" CHECK (price > 0::numeric)

postgres=#

表级约束

check约束可以涉及多个列,如下:CHECK (price > discounted_price) 产品价格要大于打折价格

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

具体结果如下:

postgres=# \d products
                   Table "public.products"
      Column      |  Type   | Collation | Nullable | Default
------------------+---------+-----------+----------+---------
 product_no       | integer |           |          |
 name             | text    |           |          |
 price            | numeric |           |          |
 discounted_price | numeric |           |          |
Check constraints:
    "products_check" CHECK (price > discounted_price)
    "products_discounted_price_check" CHECK (discounted_price > 0::numeric)
    "products_price_check" CHECK (price > 0::numeric)

postgres=#

查看表的DDL语句

PostgreSQL附带了一组函数,具体可以查看9.25. System Information Functions and Operators

一些函数可以获得对象的定义

  • 获取视图的定义可以使用pg_get_viewde
  • 获取触发器可以使用pg_get_triggerdef
  • 获取函数可以使用pg_get_functiondef
  • 获取约束可以使用pg_get_constraintdef

但是这些功能里面没有获取表定义的。

对于表的ddl可以使用pg_dump我们可以把表还有索引的语句都dump出来

pg_dump -U username -W -s -t tablename
-s, --schema-only 只转储模式, 不包括数据
-t, --table=TABLE 只转储指定名称的表

示例命令:

$ pg_dump -U postgres -W -s -t products
$ pg_dump -U postgres -W -s -t products | egrep -v "^--|^$"

如:

-bash-4.2$ pg_dump -U postgres -W -s -t products | egrep -v "^--|^$"
Password:
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_with_oids = false;
CREATE TABLE public.products (
    product_no integer,
    name text,
    price numeric,
    CONSTRAINT products_price_check CHECK ((price > (0)::numeric))
);
ALTER TABLE public.products OWNER TO postgres;
-bash-4.2$

Have a good work&life! 2020/09 via LinHong


Similar Posts

Comments