约束条件,就是给表的字段添加用户需要的约束,比方说限制输入的只能为正数、限制字段输入的特殊规则等。SQL 允许你在字段和表上定义约束,约束允许你对数据施加任意控制。
1、唯一约束
唯一约束限制字段的某一行值与该字段其他行都不一样,具有唯一性。语法如下:
CREATE TABLE test(
id text UNIQUE,
name text
)
或者
CREATE TABLE test(
id text,
name text,
UNIQUE(id)
)
或者多个字段组合成唯一约束
CREATE TABLE test(
id text,
name text,
UNIQUE(id,name)
)
你可以给约束起一个名字
CREATE TABLE test(
id text CONSTRAINT uniqueDiff UNIQUE,
name text
)
通常,如果包含在唯一约束中的那几个字段在表中有多个相同的行,就违反了唯一约束。但是在这种比较中,NULL 被认为是不相等的。这就意味着,在多字段唯一约束的情况下,如果在至少一个字段上出现 NULL ,那么我们还是可以存储同样的这种数据行。这种行为遵循 SQL 标准,但是我们听说其它 SQL 数据库可能不遵循这个标准。因此如果你要开发可移植的程序,那么最好仔细些。
2、非空约束
非空约束限制字段不能为NULL,语法如下:
CREATE TABLE test(
id text CONSTRAINT NOT NULL,
name text
)
3、主键约束
主键越是是非空约束和唯一约束的组合,语法如下:
CREATE TABLE test(
id text PRIMARY KEY,
name text
)
4、外键约束
外键约束声明一个字段(或者一组字段)的数值必须匹配另外一个表中出现的数值。我们把这个行为称为两个相关表之间的参照完整性。语法如下:
现在有一个产品表
CREATE TABLE product(
id integer PRIMARY KEY,
pro_name text,
price integer
)
然后有一个订单表,订单里的产品从产品表里面取
CAREATE TABLE order(
id integer PRIMARY KEY,
pro_id integer REFERNCES product,
totalNum integer
)
外键约束会带来一个问题,如果订单中已存在的产品被删除,那么该订单如何处理?有两种处理方式,一种是级联删除,另外一种是不予许删除。
如下例子:
CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric);
CREATE TABLE orders ( order_id integer PRIMARY KEY, shipping_address text, ...);
CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT, order_id integer REFERENCES orders ON DELETE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
)
ON DELETE RESTRICT:不允许删除
ON DELETE CASCADE:级联删除,删除orders,同时删除orders_items.
5、检查约束
检查约束允许你自定需要的约束条件,语法如下:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
)
这里限制价格只能大于0