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