约束(主键、非空、唯一性、外键、检查约束)

一、五种约束


如果DML操作所涉及数据违反了已定义的约束,则数据库系统将拒绝执行这样的操作。

Oracle数据库中,约束具体包括非空(NOT NULL)约束、唯一键(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN
KEY)约束和检查(CHECK)约束五种。

和数据表类似,约束也属于数据库对象,可以在建表的同时创建其相关约束,也可以在建表后单独添加;可以由用户命名,也可以由系统按照默认格式自动对约束进行命名;按照约束的定义位置,又可以分为表级约束和字段级约束两种。

建表的同时创建约束的的语法格式为:

其中,column_constraint为字段级约束,字段级约束在字段定义时一并给出,也只能约束其所属的单个字段;table_constraints为表级约束,与表中的字段并列定义,可以约束单个或多个字段。

1、非空约束(只能在字段级定义)

例子:

查询数据字典视图user_constraints可得到其具体名称,SQL语句如下:

2、唯一性约束(列中最多有一个空值)

Oracle会自动为唯一性约束的字段创建相应的唯一性索引。唯一性约束既可以在字段级定义、也可以在表级定义。

如果要在两个或两个以上字段上定义联合唯一键(字段组合不允许出现空值),就只能定义为表级约束了,例如:

3、主键约束(非空且唯一)

只允许一个主键,主键可以是单个字段或多字段的组合(联合主键),Oracle会自动为主键字段创建对应的唯一性索引。主键约束既可以在字段级定义、也可以在表级定义。

区别:主键是唯一的。

联合主键只能定义为表级约束:

4、外键约束

表级、字段级均可。

外键约束的特征:

(1)子表外键字段的值必须在主表被参照字段值得范围内,或者为NULL;

(2)外键参照的必须是主表的主键或唯一键(??);

(3)主表主键/唯一键被子表参照时,主表相应记录不允许被删除。

使用外键约束的相关原则:

(1)创建数据表时,先创建主表,后创建子表;删除表的顺序相反;

(2)添加数据时,先向主表中添加/插入记录,后向子表添加记录;删除数据操作顺序相反;

(3)修改数据(UPDATE)的情况要复杂一些,通常使用触发器实现。

外键约束可以和主键约束同时使用:

外键约束也可能构建于同一个表内部的两个字段之间:

5、检查约束

表级、字段级均可。

检查约束的条件表达式中不允许出现如下内容:
- currval, nextval, level, rownum等伪劣
- sysdate,
uid, user, userenv等函数
- 对其它字段值的引用

其中, uid, user, userenv函数分别用于获取当前数据库用户ID,用户名及客户端计算机信息,如:

二、约束管理

1、查看约束

如要查看当前用户的所有约束,可查询用户字典视图user_constrains:

其返回结果中的"CONSTRAINT_TYPE"字段以缩写的方式标明约束条件的具体类型:"P"代表主键约束、
代表外键约束、"U"代表唯一键约束,检查和非空约束均使用"C"标明。

如果想知道约束建立在哪个字段上,则需要查询用户字典视图user_cons_columns:

2、添加约束(添加非空约束格式特别)

建表后添加非空约束的格式有些特别——必须使用MODIFY子句添加,实际上是修改了整个字段的定义(也可以同时修改字段类型、缺省值等),例如:

3、删除约束

其中,CASCADE用于指定删除当前约束的级联约束。

删除主键约束还有另外一种方式,其语法格式为:

在删除约束时,如果还存在与该约束相关联的其他约束(如外键/关联)称为级联约束,则删除操作会失败,此时可使用CASCADE子句将其他关联约束一并删除。如:

在删除表中字段时,如果该字段处于多字段联合约束条件(联合主键、联合唯一键、存在参照当前字段的外键)中,则删除会失败,此时可使用CASCADE
CONSTRAINT子句将与该字段相关的约束一并删除。例如:

4、禁用约束

在ALTER TABLE语句中,还可以使用DISABLE
CONSTRAINT子句禁用已有约束,即关闭数据校验功能,还可以使用CASCADE选项将相关联的约束一并禁用。其语法格式如下:

相应地,可以使用ENABLE CONSTRAINT子句启用先前被禁用的约束,例如:

和关闭约束操作的情形有所不同,此时无法再使用CASCADE选项一并启用相关联的其它约束。

时间: 2024-10-12 20:27:37

约束(主键、非空、唯一性、外键、检查约束)的相关文章

数据库中创建表(包括创建主键,外键,非空列,唯一)

创建表(包括创建主键,外键,非空列,唯一) - PROS - 博客园 http://www.cnblogs.com/CodingArt/articles/1621921.html **************** 创建主键(三种方法) **************** 创建学生表: 第一种: create table student (sno char(5) primary key,/*学号*/ /*可以直接指定主键*/ sname char(20) not null,/*姓名*/ ssex c

MYSQL约束 -- not null 非空约束

2.not null 非空约束 用于确保当前列的值不为空:在创建表时,如果不指定是否可以为空,字段默认可以为NULL. -- 这是上一篇默认约束创建的表 CREATE TABLE `test`.`user`( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` VARCHAR(225) NOT NULL COMMENT '姓名', -- 这里添加了NOT NULL `sex` TINYINT(1) DEFAULT 1 COMMENT

在oracle中查询已知表名的表中所有字段名,每个字段是否是主键,是否是外键,是否为空的sql语句

查询表的所有列及其属性:select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = women;查找表的主键:select cu.* from user_cons_columns cu, user_constraints au where cu.cons

MySQL数据库(主键、索引、外键、触发器...)

主键: 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引. 索引: 是用来快速地寻找那些具有特定值的记录.主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用. 唯一性索引:这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一. 注:当你的应

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键. 创建User.java: 用户和身份证一对一的关联关系映射       private IdCart idCart; IdCart.java: 身份证和用户,一对一的关系       private User user; 1 package com.bie.bean; 2

Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则.Hibernate实例状态(瞬时状态.持久化状态.托管状态).Hibernate初始化类获取session等方法 下图内容保存数据过程 下面内容保存数据顺序.查询数据方法 get().load()和延迟加载.删除数据 下图内容删除对象顺序.修改数据顺序 下面内容关联关系映射.

是否有必要使用外键?为什么不用外键?

正方(需要) 1.数据一致性 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性. eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的.他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 2.ER图可靠性 有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常

数据库中使用外键和不使用外键有什么区别

今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因.这是一篇关于是否使用外键的讨论,讲的很有道理:对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,矛盾焦点:数据库设计是否需要外键.这里有两个问题:一个是如何

PowerDesigner删除外键关系,而不删除外键列[转]

PowerDesigner中配置外键关系时,如果要删除配置的外键关系,默认设置会一同删除外键列. 要更改此设置,需在菜单栏tools中打开Model Options,在Model Settings中点击Reference, 然后把"Auto-migrate columns"这个checkbox的勾去掉即可.

删除mysql数据库某一张主键表的所有外键关系

SELECT CONCAT('alter table ', TABLE_NAME  , ' drop foreign key ', constraint_name, ';')FROM information_schema.KEY_COLUMN_USAGE a WHERE a.TABLE_SCHEMA='某一个数据库的名称' AND a.constraint_name LIKE 'FK_Reference_%' AND REFERENCED_TABLE_NAME='某一张表的名字'