人大金仓KingbaseES数据库约束介绍

KingbaseES数据库约束介绍

关键字:

check、NOT NULL、unique、primary key约束、人大金仓、KingbaseES

概述

在数据库中,约束用于限制表数据的插入、更新和删除等操作,确保数据的完整性和一致性。其中数据类型是一种限制能够存储在表中数据类别的方法。在很多应用中,数据类型本身提供的约束太粗粒度了。例如,在产品价格表中,产品价格的列通常为正值,但是没有一种数据类型是只接受正值。而在记录学生信息的表中,学生学号列是被要求每个学生的学号只能有一行。

上述举例说明了,约束让我们能够根据我们的需要来控制表中的数据。如果一个用户试图在一个列中保存违反一个约束的数据,就会抛出错误信息。即便是这个值来自于默认值定义,这个规则也同样适用。

约束类型

当前KES支持的约束类型包括非空约束(NOT NULL Constraint)、检查约束、唯一约束、主键约束、外键约束及排他约束等。

2.1检查约束

检查约束:用于确保列中数据满足指定条件,这些条件可以是表达式。用于限制列中值必须要满足一定的逻辑条件,在确保数据完整性和一致性方面发挥重要作用。

数据完整性:检查约束确保表中的数据符合预期的格式和规则,防止无效或不合理的数据插入。

数据一致性:检查约束可以确保表中的数据始终保持一致,符合预期的标准。

  1. 语法

../../../_images/CHECK.png

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唯一约束

唯一约束用于确保表中的特定列保持的数据在所有行中是唯一的,不允许出现重复值。唯一表约束的行为与列约束的行为相同,只是表约束能够跨越多列。

  1. 语法

UNIQUE (列约束)

UNIQUE ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (表约束)

../../../_images/UNIQUE.png

UNIQUE 约束指定一个表中的一列或多列组成的组包含唯一的值。对于唯一约束来说,空值是被认为不相等的。

  1. 用法

--列级唯一约束

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. 特点

1.唯一约束可以用于单列或多列。

2.允许空值,空值不违反唯一性约定。

3.在定义主键时,该列默认唯一的。

注:唯一约束通常是依赖于唯一索引实现,这有助于提升查询效率,但在维护索引的同时,提高了插入、更新和删除的成本。当列作用于外键时,通常也是定义为唯一约束,确保表中引用的值时唯一的。

2.4主键约束

主键约束可以用作表中行的唯一标识符的一个列或一组列,并且这些值都是唯一的并且非空。一个表最多只能有一个主键(而非空约束和唯一约束可以有任意数量)

唯一标识:主键约束确保表中的每一行都有唯一标识。

确保唯一性:主键列不能重复,每一行都能通过主键唯一标识。

  1. 语法

PRIMARY KEY (列约束)

PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (表约束)

../../../_images/PRIMARY_KEY.png

PRIMARY KEY 强制的数据约束可以看成是UNIQUE和NOT NULL的组合,但是把一组列标识为主键也为模式设计提供了元数据,因为主键标识其他表可以依赖这一个列集合作为行的唯一标识符。

  1. 用法

-- 列级主键约束

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. 特点

1.唯一性:主键约束包含了唯一约束的要求。

2.非空性:主键列同样还要求NOT NULL,因为主键用于唯一标识每一行,而空值无法唯一标识。

3.不可更改性:主键列的值在插入后不允许更改,这是为了保持数据的唯一性和一致性。

2.5外键约束

外键约束在关系数据库中建立表与表之间的连接,它指定一个表的列(一组列)引用另一个表的主键列,确保引用的数据在被引用表中存在。

  1. 语法

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 ] (表约束)

../../../_images/REFERENCES1.png

  1. 用法

--列级外键约束

CREATE TABLE orders(

    order_id SERIAL PRIMARY KEY,

    product_id INT REFERENCES products(product_id),

    quantity INT

);

  1. 特点

1.引用唯一值列:外键所引用的列必须是一个主键或者被唯一约束所限制,这意味着被引用列总是拥有一个唯一索引(唯一索引位于主键约束后唯一约束下的索引)。

参考资料

KingbaseES SQL语言参考手册

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值