合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] ## CHECK 语法 任何应用都对数据的正确性有要求。比如,用户的年龄必须是大于零的,用户的登录名中不能包含空格,用户的密码必须满足一定的复杂度,等等。 <br/> 语法 ``` [CONSTRAINT constraint_name] CHECK(expr) ``` > CONSTRAINT 可以给约束起名,方便报错时,更加清楚 > ### 带约束名称 不带约束名 ``` CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0) ); ``` 带约束名称 ``` CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) ); ``` ### 年龄不能小于0 ``` CREATE TABLE users ( id INTEGER PRIMARY KEY, age INTEGER NOT NULL CHECK(age > 0) ); ``` or ``` CREATE TABLE users ( id INTEGER PRIMARY KEY, age INTEGER NOT NULL, CONSTRAINT users_age_check CHECK(age > 0) ); ``` 多行约束 check ``` CREATE TABLE users ( id INTEGER PRIMARY KEY, age INTEGER NOT NULL, CONSTRAINT users_age_check CHECK(age > 0), CONSTRAINT users_age_check1 CHECK(age < 10) ); ``` 修改字段时 ``` ALTER TABLE users ADD CONSTRAINT users_age_check CHECK(age > 0); ``` ### 长度限制 ``` CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(45) NOT NULL, login_name VARCHAR(45) NOT NULL CHECK(length(login_name) >= 4), password VARCHAR(45) NOT NULL CHECK(length(password) >= 8), CHECK(login_name <> password) ); ``` ### 约束设计两个字段的关系 原价大于打折价格 ```sql CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric CHECK (discounted_price > 0), CHECK (price > discounted_price) -- or CHECK (discounted_price > 0 AND price > discounted_price) ); ``` > 约束可是作为一个独立的项出现在逗号分隔的列列表中,被称为表约束 > 可用 `AND` 可设置对条件 ## 非空约束 ``` CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric ); ``` 等效于`CHECK (column_name IS NOT NULL)`,但是前者更高效,后者可以为约束取名 一个列也可以有多个约束 ``` price numeric NOT NULL CHECK (price > 0) ``` ## 唯一约束 ``` CREATE TABLE products ( product_no integer UNIQUE, name text, price numeric ); ``` 表约束 ``` CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) ); ``` 为唯一锁命名 ``` CREATE TABLE products ( product_no integer CONSTRAINT must_be_different UNIQUE, name text, price numeric ); ``` ## 主键约束 ``` CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); ```