您好,欢迎访问三七文档
1约束是数据库中直观重要的组件,他们限制(约束)了通过INSERT、UPDATE和DELETE语句在表中添加、修改或者删除的内容。通过约束来限制在列、行、表和表之间的关系中所放置的内容。NOTNULL(非空):NOTNULL只作用于单列,它可以将一列限制为强制性的,也就是说无法在该列中插入没有值的行。同理,也不能将一个强制的列从某个值更新为空值。查询NOTNULL或者CHECK约束语句:SELECTB.OWNER,B.CONSTRAINT_NAME,B.TABLE_NAME,B.COLUMN_NAME,B.POSITIONFROMUSER_CONSTRAINTSAINNERJOINUSER_CONS_COLUMNSBONB.OWNER=A.OWNERANDB.CONSTRAINT_NAME=A.CONSTRAINT_NAMEWHEREA.CONSTRAINT_TYPE='C';UNIQUE(唯一):UNIQUE约束是一个表级约束,因为它可以让一个列或者列集合的值在表中成为唯一的。是行外约束,在CREATE语句的列列表之后设定,或者在创建表之后通过ALTER语句添加这种约束。设计优良的表至少有两个唯一键:自然键和代理键。自然键是描述表的主题并使每一行都是唯一的一个列或者列集合,很少会是一个单独的列,而所有的代理键都是以单独列的形式唯一索引的,通常由序列产生。自然键和代理键都成为潜在的数据表的主键【不能为空值】,它们同样也都是候选键,一般把代理键选为主键,这样所有连接都会使用一列,编写连接操作就简单了,而且长期维护成本也会降低,因为代理键应该不会发生变化或者重用。拥有大量数据时,代理键无法提供最理想搜索性能时,解决办法就是利用代理键和自然键组成一个唯一的索引。查询UNIQUE约束语句:SELECTB.OWNER,B.CONSTRAINT_NAME,B.TABLE_NAME,B.COLUMN_NAME,B.POSITIONFROMUSER_CONSTRAINTSAINNERJOINUSER_CONS_COLUMNSBONB.OWNER=A.OWNERANDB.CONSTRAINT_NAME=A.CONSTRAINT_NAMEWHEREA.CONSTRAINT_TYPE='U';2每一个UNIQUE约束都会创建一个UNIQUEINDEX,无法删除这个隐式创建的索引。查询唯一索引:SELECTA.TABLE_OWNER,B.INDEX_NAME,A.UNIQUENESS,B.TABLE_NAME,B.COLUMN_POSITION,B.COLUMN_NAMEFROMUSER_INDEXESAINNERJOINUSER_IND_COLUMNSBONB.INDEX_NAME=A.INDEX_NAMEANDB.TABLE_NAME=A.TABLE_NAMEWHEREA.UNIQUENESS='UNIQUE';主键:主键唯一标识表中的每一行,是一张表和另外一张表的数据之间的联系点,当使用参考完整性时,主键和外键通过连接操作将不同的表数据链接起来。主键可以是列约束【代理键】和表约束【自然键】,代理主键【单列主键】具有非空和唯一,而自然主键【多列主键】可以有一至多(但不能全部)列含有空值。Oracle数据库将所有的主键都定义为NOTNULL且UNIQUE的,为主键约束赋予有意义的名称,以便追溯主键约束上的错误。查询主键约束语句:SELECTB.OWNER,B.CONSTRAINT_NAME,B.TABLE_NAME,B.COLUMN_NAME,B.POSITIONFROMUSER_CONSTRAINTSAINNERJOINUSER_CONS_COLUMNSBONB.OWNER=A.OWNERANDB.CONSTRAINT_NAME=A.CONSTRAINT_NAMEWHEREA.CONSTRAINT_TYPE='P';外键:外键约束既是列级约束也是外部约束。列级约束会将值列表限制为主键列(集合)中的值,主键列(集合)一般存在于另外一张表中,因此产生外部约束。当外键指向同一张表中的主键时,就形成了自引用。外键始终包含与主键相同的列数且所有列的数据类型必须相匹配。外键约束会让数据库来负责实现交叉引用规则(参考完整性),虽然外键约束可以确保数据的参考完整性,但是与此同时需要付出性能降低的代价。许多商业数据库不会通过约束3来实现参考完整性,而是通过存储程序实现参考完整性,消除外键约束所造成的开销;或者EDP审计员通过舞台环境添加外键的方法来确认数据的完整性,然后删除外键。外键不会实现NOTNULL约束。查询外键约束语句:SELECTA.CONSTRAINT_NAME||CHR(10)||'('||B.TABLE_NAME||'.'||B.COLUMN_NAME||')'CONSTRAINT_SOURCE,'REFERENCES'||CHR(10)||'('||B.TABLE_NAME||'.'||B.COLUMN_NAME||')'REFERENCES_COLUMNFROMUSER_CONSTRAINTSA,USER_CONS_COLUMNSB,USER_CONS_COLUMNSCWHEREA.CONSTRAINT_NAME=B.CONSTRAINT_NAMEANDA.R_CONSTRAINT_NAME=C.CONSTRAINT_NAMEANDB.POSITION=C.POSITIONANDA.CONSTRAINT_TYPE='R'ORDERBYB.TABLE_NAME,A.CONSTRAINT_NAME;CHECK(检查):CHECK约束让你能在插入和更新时核查列值,可设置极限范围,与外键约束所施加的极限条件有所区别,因为CHECK约束是描述其极限范围的,而不是将它们映射为外部表中的动态值,不推荐使用CHECK约束来确保非空行为,可作用在实数、字符或者字符串的集合上。数据库管理系统不支持CHECK约束时,行级约束就必须在数据库触发器中实现,MySql中不支持此类约束,用自定义数据类型【ENUM、SET】模仿集合成员极限约束触发器:数据库触发器允许你实现一些逻辑,允许限制列级和行级的行为,也允许实现外部约束。无法进行表级约束,因为他们是在开始对表处理事务的DML语句之后执行的,触发器分为语句级和行级触发器。
本文标题:数据库约束
链接地址:https://www.777doc.com/doc-2333186 .html