列级别约束条件

DB2 约束

约束

关系数据库中二维表的每一列数据除了需要指定数据类型,有时还需要指定一些约束条件,来限制该列能够存储哪些数据。关系数据库中主要存在五种约束(Constraint):非空、唯一、主键、外键、检查。

约束有两个级别:列级别和表级别。如果某个约束只对某个列有限制,就是列级别约束,如果某个约束与多个字段相关,则需要定义成表级别约束。

3.12.1 非空约束

非空(Not Null)约束表示某个字段中不允许出现空值(Null),就规定这个字段使用非空约束,它是一个列级别约束。其定义方式为:

字段名称 数据类型 NOT NULL

3.12.2 唯一约束

某个字段中不允许出现重复值,就规定这个字段使用唯一(Unique)约束,同样它也是一个列级别的约束。需要注意的是,从 DB2 V9 开始,唯一约束同时也要求非空,即定义了某个字段唯一,则该列当中既不能出现重复值,也不能出现空值。其定义方式为:

字段名称 数据类型 UNIQUE

3.12.3 主码约束

主码(Primary Key)约束又称为主键约束,是一个或者多个字段的组合,关系数据库要求在一张表中,不能出现完全相同的两行,通常主键就是能够用于区分不同记录的字段或者字段组合。在实际项目中,每张表往往会定义一个编号字段来作为主码。

主码要求同时满足非空和唯一的条件,如果主码是由多个字段组合构成的,每个字段中都不能出现空值,这些字段的组合不能重复。

如果单独一个字段作为主码,它既可以定义成列级别约束,也可以定义成表级别约束。如果是多个字段组合作为主码,必须定义成表级别约束。

列级别主码的定义方式为:

字段名称 数据类型 NOT NULL PRIMARY KEY

需要注意的是,在定义主码之前必须指定该字段为非空的。

表级别主码的定义方式为:

PRIMARY KEY( 字段列表 )

3.12.4 外码约束

外码(Foreign Key)约束又称为外键约束,通常是定义两张表之间的关联的。相关联的两张表一张作为主表,一张作为从表,从表中有一个或者多个字段参照主表中相应的字段,也就是说,从表中这些字段当中只能出现主表中出现过的值(或者是空值),不能出现其他没有出现过的值。下面通过一个例子来讲解外码的创建。

例 3?19 外码约束。

建立两张表,一张为系别表 Department,包括编号(DeptNo)和系名(DeptName)两个字段,一张为学生表 Student,包括学号(StuNo)、姓名(Name)、性别(Sex)和系别(DeptNo),其中学生表的系别字段要参照系别表,同时要求当系别表中某行记录删除时,自动删除学生表中该系的所有学生。

CREATE TABLE Department ( DeptNo CHAR(10) NOT NULL PRIMARY KEY, DeptName VARCHAR(20) NOT NULL ) CREATE TABLE Student ( StuNo CHAR(11) NOT NULL PRIMARY KEY, Name VARCHAR(8) NOT NULL, Sex CHAR(2), DeptNo CHAR(10), FOREIGN KEY(DeptNo) REFERENCES Department(DeptNo)
ON DELETE CASCADE )

在从表 Student 创建的最后一句中,ON DELETE CASCADE 子句指的是当主表中的数据删除时,从表中对应的数据一起被级联删除。

此处还可以写成 ON DELETE SET NULL,表示主表数据删除时,从表对应数据设置为空值,其他的写法请参见信息中心。

关于外码的创建,有三点需要注意:

一是必须先定义主表,再定义从表;

二是从表所参照的字段在主表中必须是主码或者候选码(有唯一约束的字段);

三是从表中对应字段的数据类型必须与主表中的相同,但字段名称并不要求相同。

3.12.5 检查约束

如果要求某个字段在某个范围内取值,就需要使用检查(Check)约束,它可以是列级别的约束,语法为:

字段名称 数据类型 CHECK( 约束条件 )

也可以是表级别的约束,语法为:

CHECK( 约束条件 )

3.12.6 其他约束

除了以上五种标准 SQL 定义的约束,DB2 中还扩展了一些约束,比较常用的有缺省值和标识列。

缺省值(Default),又叫做默认值,用于指定某个字段的默认值,当插入数据的时候没有给出值,将使用这个默认值进行填充,它是一个列级别约束,其语法为:

字段名称 数据类型 DEFAULT < 默认值 >

标识列(Identity),定义在数值型字段上的一种约束,用它可以在插入一行新记录的时候生成一个按照一定规律自动增长的值。

标识列可以有两种生成方式:GENERATED ALWAYS 和 GENERATED BY DEFAULT,下面详细介绍这两种方式的区别。

1 . GENERATED ALWAYS

这种生成方式总是由 DB2 生成值,不能在应用程序或者 SQL 语句中直接提供值。

例 3?20 GENERATED ALWAYS 生成的标识列。

下例说明了通过 GENERATED ALWAYS 生成的标识列如何使用。运行下例之前,首先要把自动提交的选项关闭(db2 +c)。

CREATE TABLE inventory1 ( partno INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 100, INCREMENT BY 1), description CHAR(20) ); INSERT INTO inventory1 VALUES (DEFAULT,‘door‘); ---> 成功,插入了 100,door INSERT INTO inventory1 (description) VALUES (‘hinge‘); --->
成功,插入了 101,hinge INSERT INTO inventory1 VALUES (102,‘window‘); ---> 失败 ,partno 不能插入值 COMMIT; INSERT INTO inventory1 (description) VALUES (‘lock‘); ---> 成功,插入了 102,lock ROLLBACK; ---> 取消了前一步操作 INSERT INTO inventory1 (description) VALUES (‘frame‘); ---> 成功,插入了
103,frame COMMIT; SELECT * FROM inventory1; 100 door 101 hinge 103 frame

2 . GENERATED BY DEFAULT

采用这种方式,如果用户没有给标识列提供值,DB2 将自动生成一个值;如果用户给标识列提供了值,DB2 将不再生成值,而是直接使用用户提供的值。使用这种方式,不能保证生成的值是唯一的。

例 3?21 GENERATED BY DEFAULT 生成的标识列。

下例说明了通过 GENERATED BY DEFAULT 生成的标识列如何使用。运行下例之前,同样需要首先把自动提交的选项关闭(db2 +c)。

CREATE TABLE inventory2 ( partno INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 100, INCREMENT BY 1), description CHAR(20) ); INSERT INTO inventory2 VALUES (DEFAULT,‘door‘); ---> 成功,插入了 100,door INSERT INTO inventory2 (description) VALUES (‘hinge‘); --->
成功,插入了 101,hinge INSERT INTO inventory2 VALUES (102,‘window‘); ---> 成功,插入了 102,window COMMIT; INSERT INTO inventory2 (description) VALUES (102,‘lock‘); ---> 成功,插入了 102,lock INSERT INTO inventory2 (description) VALUES (‘lock‘); ---> 成功,插入了 102,lock ROLLBACK;
---> 取消了前一步操作 INSERT INTO inventory2 (description) VALUES (‘frame‘); ---> 成功,插入了 103,frame COMMIT; SELECT * FROM inventory2; 100 door 101 hinge 102 window 103 frame

可以使用 IDENTITY_VAL_LOCAL() 函数来获取当前生成列的生成值,它主要是用于在从表中给对应的列插入数据,例如:

INSERT INTO PARENT_TABLE (PK_ID, ... ) VALUES (DEFAULT, ...); INSERT INTO CHILD1_TABLE (...,FK_ID,...) VALUES (....,IDENTITY_VAL_LOCAL(),...); INSERT INTO CHILD2_TABLE (...,FK_ID,...) VALUES (....,IDENTITY_VAL_LOCAL(),...);

其中 PARENT_TABLE 为主表,PK_ID 为主码,是标识列。而 CHILD1_TABLE 和 CHILD2_TABLE 是参照于主表的从表,其中 FK_ID 是外码,参照主表中的主码。由于外码的取值要在主码所参照的主表中出现,而主表中的主码是由标识列自动生成的,要想知道当前生成的值就需要使用 IDENTITY_VAL_LACAL() 函数。

时间: 2024-11-09 10:15:18

列级别约束条件的相关文章

基础入门_Python-模块和包.深入SQLAlchemy之列级别约束与表级别约束?

简单介绍: 说明: 此模块主要用于将关系型数据库表映射到PY的类,行映射到PY类的实例,列映射为PY实例的属性,由于其兼容众多DB-API及扩展,SO可以优先考虑数据模型,而忽略底层的DB-API切换,数据迁移更方便. 快速安装: pip install --upgrade SQLAlchemy 创建引擎: 1. 连接数据库前需创建引擎,作为执行SQL的接口,其实底层通过Pool(连接池)和Dialect(翻译器)将映射后的PY语句转换为对应DB-API支持的原生SQL语句去执行,这样写PY时就

三、数据表的基本操作

3.1.创建数据表 创建数据表指的是在已经创建好的数据库中建立新表.创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(实体完整性.引用完整性.域完整性)约束的过程. 创建表的语法格式 数据表属于数据库,在创建数据表之前,应该先创建数据库,指定在哪个数据库中进行. mysql> USE test; Database changed mysql> CREATE TABLE tb_name ( 字段名1,数据类型 [列级别约束条件] [默认值], 字段名2,数据类型 [列级别约束条件

学习《MYSQL》课程,日期2017.4.25-2017.4.30

显示数据库: SHOW DATABASES database_name; 创建数据库: CREATE DATABASES database_name; 删除数据库: DROP DATABASE database_name; 创建数据表: CREATE TABLE<表名> ( 字段名1,数据类型[列级别约束条件] [默认值], ); 例: CREATE TABLE TB1 (ID INT(11), NAME VARCHAR(20)); 主键:字段名 数据类型 PRIMARY KEY[默认值];

MySQL 常用命令大全

1.mysql:连接数据库 mysql 命令用户连接数据库. mysql 命令格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1)  连接到本机上的 MYSQL 命令 mysql -u root -p,回车后提示你 输密码. 注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好 MYSQL,超级用户 root 是没有密码的,故直接回车即可进入到 MYSQL 中了, MYSQL 的提示符是: mysql> 2)  连接到远程主机上的

数据库(MySQL)表基本操作

                                数据库表基本操作 思前想后,最终还是把博客的名字改成了数据库表基本操作,以前叫SQL语句大全,感觉用"大全"这个名词太大了,而文章中介绍的内容有限而且也不深.如果您在阅读的过程中发现有不完善的地方,欢迎补充说明. 创建数据库 一提笔就讲创建数据库,感觉好像是从半道上开始的.创建数据库前总得安装数据库吧,不管是SQL Server.mysql.Oracle.但是如果这样写下去,不知道这篇博客还能不能完成,那就默认是安装好数据

MySQL数据库操作3-数据表操作1-创建,约束

创建数据表: 代码: create table 表名 ( 字段1 数据类型 [列级别约束条件][默认值], 字段2 数据类型 [列级别约束条件][默认值], ...... [表级别约束条件] ); 注意: 1.表名不区分大小写, 2.[]内的为可选项. 示例: create table tb_emp1 ( id int(11), name varchar(25), deptId int(11), salary float ); 主键约束: 主键约束要求主键字段上的数据唯一. 单字段主键: 字段1

MySQL(五)之DDL(数据定义语言)与六大约束

前言 前面在数据库的讲解中,其实很多东西都非常的细节,在以前的学习过程中我都是没有注意到的.可能在以后的工作中会碰到所以都是做了记录的. 接下来,我将分享的是MySQL的DDL用来对数据库及表进行操作的. mysql中保存了很多数据库.一个数据库中可以保存很多表. 对数据表的增(创建表)删(删除表)改(修改表字段)查(查询表结构).  注意:这里的操作对象是表,对表的操作也就是表的结构,和表中的字段的操作(字段和记录要分清楚) 前提:表是在数据库下的,所以要先确实使用哪个数据库. 一.DDL之

MySQL中数据表的基本操纵

本文基于对国家863中部软件孵化器编著的<MySQL从入门大精通>一书的操作实践.  一.创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句 USE 数据库名  指定操作是在那个数据库中进行. 创建数据表的语句为CREATE TABLE ,语法规则如下: 1 CREATE TABLE 表名 2 ( //为括号 3 字段名1 数据类型 [列级别约束条件] [默认值], 4 字段名1 数据类型 [列级别约束条件] [默认值], 5 ...... 6 [表级约束条件] 7 ); //要有分

MariaDB 表的基本操作(3)

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB来代替MySQL的InnoDB,MariaDB由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购MySQL的所有权也落入Oracle的手中.M