KingbaseES数据库约束介绍
关键字:
check、NOT NULL、unique、primary key约束、人大金仓、KingbaseES
概述
在数据库中,约束用于限制表数据的插入、更新和删除等操作,确保数据的完整性和一致性。其中数据类型是一种限制能够存储在表中数据类别的方法。在很多应用中,数据类型本身提供的约束太粗粒度了。例如,在产品价格表中,产品价格的列通常为正值,但是没有一种数据类型是只接受正值。而在记录学生信息的表中,学生学号列是被要求每个学生的学号只能有一行。
上述举例说明了,约束让我们能够根据我们的需要来控制表中的数据。如果一个用户试图在一个列中保存违反一个约束的数据,就会抛出错误信息。即便是这个值来自于默认值定义,这个规则也同样适用。
约束类型
当前KES支持的约束类型包括非空约束(NOT NULL Constraint)、检查约束、唯一约束、主键约束、外键约束及排他约束等。
2.1检查约束
检查约束:用于确保列中数据满足指定条件,这些条件可以是表达式。用于限制列中值必须要满足一定的逻辑条件,在确保数据完整性和一致性方面发挥重要作用。
数据完整性:检查约束确保表中的数据符合预期的格式和规则,防止无效或不合理的数据插入。
数据一致性:检查约束可以确保表中的数据始终保持一致,符合预期的标准。
- 语法
CHECK指定一个产生布尔结果的表达式,一个插入或更新操作要想成功,其中新的或被更新的行必须满足该表达式。计算出TRUE 或 UNKNOWN的表达式就会成功。只要任何一个插入或更新操作的行产生了 FALSE结果,将报告一个错误异常并且插入或更新不会修改数据库。一个被作为列约束指定的检查约束只引用该列的值,而一个出现在表约束中的表达式可以引用多列。
(2)举例
-- 列级检查约束
CREATE TABLE employees1(
id SERIAL primary key,
name varchar(40) ,
salary DECIMAL(10,2) CHECK(salary >= 0)
);
上述例子中创建职员表,其中职工薪资列包含检查约束,CHECK(salary >= 0),用于确保列salary中的值不小于0。
--对于插入数据中salary项小于0则会失败
insert into employees1(name, salary) values('tom',-100);
-- 多列检查约束+表约束
CREATE TABLE products(
product_id integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
上述产品表中,price列和discounted_price列均包含了检查约束,且在最后添加了表级约束 CHECK (price > discounted_price)。
(3)特点
1.表达式灵活:可以使用任意表达式作为检查约束的条件,只要该表达式返回布尔值。
2.可以用逻辑运算符来组合多个条件。
3.利用alter table语句可以在已有的表中添加检查约束。
2.2非空约束
非空约束用于确保表中的特定列不包含空值,确保数据的完整性,防止列中插入NULL值,从而强制要求列中的数据都是有效的。
(1)用法
-- 非空约束
CREATE TABLE employees(
id SERIAL primary key,
name varchar(40) NOT NULL,
age int
);
-- 支持多列添加NOT NULL 约束
CREATE TABLE students(
stu_id int primary key,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
age int
);
(2)特点
1.非空约束可以适用于表中的任何数据类型,如数值、布尔值、字符、日期等。
2.利用相应的alter table语句可以在已有的表中添加非空约束。
3.定义主键列时,该列会默认非空,主键列不包含空值。
2.3唯一约束
唯一约束用于确保表中的特定列保持的数据在所有行中是唯一的,不允许出现重复值。唯一表约束的行为与列约束的行为相同,只是表约束能够跨越多列。
- 语法
UNIQUE (列约束)
UNIQUE ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (表约束)
UNIQUE 约束指定一个表中的一列或多列组成的组包含唯一的值。对于唯一约束来说,空值是被认为不相等的。
- 用法
--列级唯一约束
CREATE TABLE products(
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) UNIQUE
);
-- 表级唯一约束
CREATE TABLE products(
product_id INT,
product_name VARCHAR(100),
UNIQUE(product_id)
);
- 特点
1.唯一约束可以用于单列或多列。
2.允许空值,空值不违反唯一性约定。
3.在定义主键时,该列默认唯一的。
注:唯一约束通常是依赖于唯一索引实现,这有助于提升查询效率,但在维护索引的同时,提高了插入、更新和删除的成本。当列作用于外键时,通常也是定义为唯一约束,确保表中引用的值时唯一的。
2.4主键约束
主键约束可以用作表中行的唯一标识符的一个列或一组列,并且这些值都是唯一的并且非空。一个表最多只能有一个主键(而非空约束和唯一约束可以有任意数量)
唯一标识:主键约束确保表中的每一行都有唯一标识。
确保唯一性:主键列不能重复,每一行都能通过主键唯一标识。
- 语法
PRIMARY KEY (列约束)
PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (表约束)
PRIMARY KEY 强制的数据约束可以看成是UNIQUE和NOT NULL的组合,但是把一组列标识为主键也为模式设计提供了元数据,因为主键标识其他表可以依赖这一个列集合作为行的唯一标识符。
- 用法
-- 列级主键约束
CREATE TABLE users(
user_id SERIAL PRIMARY KEY,
user_name VARCHAR(50)
);
-- 表级主键约束
CREATE TABLE users(
user_id SERIAL,
user_name VARCHAR(50),
primary key (user_id, user_name)
);
- 特点
1.唯一性:主键约束包含了唯一约束的要求。
2.非空性:主键列同样还要求NOT NULL,因为主键用于唯一标识每一行,而空值无法唯一标识。
3.不可更改性:主键列的值在插入后不允许更改,这是为了保持数据的唯一性和一致性。
2.5外键约束
外键约束在关系数据库中建立表与表之间的连接,它指定一个表的列(一组列)引用另一个表的主键列,确保引用的数据在被引用表中存在。
- 语法
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (列约束)
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (表约束)
- 用法
--列级外键约束
CREATE TABLE orders(
order_id SERIAL PRIMARY KEY,
product_id INT REFERENCES products(product_id),
quantity INT
);
- 特点
1.引用唯一值列:外键所引用的列必须是一个主键或者被唯一约束所限制,这意味着被引用列总是拥有一个唯一索引(唯一索引位于主键约束后唯一约束下的索引)。




