oracle数据库中提供的5种约束

约束作用:用来保持数据的完整性,防止无效数据进入到数据库中。
oracle数据库中提供的5种约束,都是限定某个列或者列的组合的。
1、主键约束(PRIMARY KEY):在一个表中能唯一的标识一行。主键可以限定在多个列上。
2、唯一键约束(UNIQUE key):在一个表中能唯一的标识一行,唯一键也可以限定在多个列上。
主键和唯一键的区别:
a、一个表中最多只能有一个主键。可以多个唯一键。
b、主键所限定的列不能为null,唯一键所限定的列可以为null.
3、外键约束(FOREIGN key):
   引用表:有外键约束的列所在的表。
   被引用表:外键所引用的列。被引用的列只能是主键或者唯一键。
4、非空约束(NOT null):表示该列上的数据不能有null值。
5、检查性约束(check):表示该列上的数据必须满足某一个条件表达式。

如何创建约束:
1、在创建表的同时创建约束
   a.列级别约束:在每个列写完之后写约束。
          CREATE TABLE t_08132(id NUMBER(10) PRIMARY KEY ,
                                NAME CHAR(10) NOT NULL,
                                gender CHAR(2) CHECK (gender IN (‘男‘,‘女‘)),
                                email CHAR(20) UNIQUE
                                )
          INSERT INTO t_08132 VALUES(1,‘a‘,‘男‘,‘[email protected]‘)                               
          INSERT INTO t_08132 VALUES(2,‘a‘,‘男‘,‘[email protected]‘)                               
          INSERT INTO t_08132 VALUES(3,‘c‘,‘男‘,‘[email protected]‘)                               
          INSERT INTO t_08132 VALUES(4,‘d‘,‘‘,‘[email protected]‘)                               
          INSERT INTO t_08132 VALUES(5,‘e‘,‘妖‘,‘[email protected]‘)       
          //外键约束
          CREATE TABLE t_08133( id NUMBER(10) PRIMARY KEY ,
                                NAME CHAR(10) NOT NULL,
                                deptno NUMBER(2) REFERENCES dept(deptno)                               
                                )
          INSERT INTO t_08133 VALUES(1,‘a‘,20) 
          //给约束命名         
          CREATE TABLE t_08134(id NUMBER(10) CONSTRAINT t4_id_pk PRIMARY KEY ,
                                NAME CHAR(10) CONSTRAINT t4_name_nn NOT NULL,
                                gender CHAR(2) CONSTRAINT t4_gen_ck CHECK (gender IN (‘男‘,‘女‘)),
                                email CHAR(20) CONSTRAINT t4_em_uk UNIQUE,
                                deptno NUMBER(2) CONSTRAINT t4_deptno_fk REFERENCES dept(deptno)                               
                                )
          INSERT INTO t_08134 VALUES(5,‘e‘,‘男‘,‘[email protected]‘,NULL)                      
          INSERT INTO t_08134 VALUES(6,‘e‘,‘男‘,‘[email protected]‘,NULL)                      
   b.表级别约束:在所有列写完之后写约束。注意,notnull约束不能写在表级别上。
      CREATE TABLE t_08135(id NUMBER(10)  ,
                                NAME CHAR(10) CONSTRAINT t5_name_nn NOT NULL,
                                gender CHAR(2) ,
                                email CHAR(20) ,
                                deptno NUMBER(2) ,
                                CONSTRAINT t5_id_pk PRIMARY KEY (ID),
                                CONSTRAINT t5_gen_ck CHECK (gender IN (‘男‘,‘女‘)),
                                CONSTRAINT t5_em_uk UNIQUE(email),
                                CONSTRAINT t5_deptno_fk FOREIGN KEY (deptno) REFERENCES dept(deptno)                               
                               )
约束的名字:一般规则 约束所在的表_约束所在的列_约束类型
 emp_empno_pk,通常只给主键、外键、唯一键命名。

2、在创建表之后创建约束
语法:
Alter TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 [(列名列表)]
CREATE TABLE t08161 (ID NUMBER,NAME CHAR(10),sex CHAR(2) ,email CHAR(10),deptno NUMBER)
//在ID字段上添加主键约束
ALTER TABLE t08161 ADD CONSTRAINT t1_id_pk PRIMARY KEY(ID)
//在sex字段上添加检查性约束
ALTER TABLE t08161 ADD CONSTRAINT t1_email_ck CHECK (sex IN (‘男‘,‘女‘))
//在email上添加唯一性约束
ALTER TABLE t08161 ADD CONSTRAINT t1_email_uk UNIQUE (email)
//在deptno上添加外键约束,引用于dept的deptno字段。
ALTER TABLE t08161 ADD CONSTRAINT t1_deptno_fk FOREIGN KEY (deptno) REFERENCES dept(deptno)
//在name上添加非空约束
ALTER TABLE t08161 ADD CONSTRAINT t1_name_nn NOT NULL (NAME)    //加不上

ALTER TABLE t08161 MODIFY NAME NULL  
ALTER TABLE 表名 MODIFY 字段名 NULL/NOT NULL   //通过该语法设置某一个字段为null或者not NULL.
//练习:
创建表学生表,里面包含学号(主键),姓名(非空),年龄,入班日期,
班级编号(外键,引用于dept表部门编号)
要求,在创建完表之后建立约束。
CREATE TABLE t08162 (sno NUMBER ,sname CHAR(10) ,sage NUMBER ,indate DATE,classno NUMBER)
ALTER TABLE t08162 ADD PRIMARY KEY (sno)
ALTER TABLE t08162 MODIFY sNAME NOT NULL
ALTER TABLE t08162 ADD FOREIGN KEY(classno) REFERENCES dept(deptno)
4、如何删除约束
ALTER TABLE 表名 DROP PRIMARY KEY|UNIQUE (列)|CONSTRAINT 约束名
ALTER TABLE t08162 DROP PRIMARY KEY
练习:删除t08162上的classno上的外键约束
ALTER TABLE t08162 DROP CONSTRAINT sys_c005467
5、约束的启用和禁用。
语法:
Alter TABLE 表名 Disable|ENABLE CONSTRAINT 约束名

转自:http://www.blogjava.net/stevenjohn/archive/2012/09/04/387023.html

时间: 2024-08-02 02:51:14

oracle数据库中提供的5种约束的相关文章

给Oracle数据库中CLOB字段插入空值

遇到往ORACLE数据库中插入数据时总是报ORA-01084 invalid argument in OCI call错误,经分析是因为表中的一个字段类型为CLOB,并且可为空,当在给该字段插入空值时引发的该错误.后来判断是否为空值,如果为空值使用DBNull.Value,以此解决了该问题. Null 指的是无效的对象引用:而 DBNull 是一个类, DBNull.Value 是它唯一的实例 .DBNull 的实例 DBNull.Value是数据库表中的空数据在 .Net 代码中的表现形式.我

Oracle数据库中序列(SEQUENCE)的用法详解

在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了序列的用法,希望能够对您有所帮助. AD: 在Oracle数据库中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其实是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值. 创建序列需要CREATE SEQUENCE系统权限

Oracle数据库中调用Java类开发存储过程、函数的方法

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

Oracle数据库中闪回恢复的详细分析

Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的.这个功能有很大的限制,就是相关事务的undo不能被覆盖,否则就无力回天了.oracle10g大大的增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的. flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将Oracle数据库往后滚.为了保存管理和备份恢复相

如何处理Oracle数据库中的坏块问题

本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了. 一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在我们对数据块进

Oracle数据库中的blob类型解析

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢? 这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作

如何导出远程oracle数据库中的表结构

从远程oracle数据库上导出指定表的表结构语句有两种方法: 方法一:通过sql语句获得 1,make sure that you can connect the remote database. 2,enter into the sqlplus,and execute the command: select dbms_metadata.getddl('TABLE',tablename) from user_tables and you will get all the tables defin

详解大数据采集引擎之Sqoop&采集oracle数据库中的数据

欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一.Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop import命令将RDBMS中的数据导入到HDFS/Hive/HBase中,也可以通过sqoop export命令将HDFS/Hive/HBase中的

EXCEL表数据导入到ORACLE数据库中

将EXCEL表导入ORACLE数据库中 一.建立表 1.建立表 2.查询表 select * from yy; 二.导入程序 在excel中找到需要导入的数据 2.将excel中的数据另存为文本文件(有制表符分割的) 3.在pl*sql中选择tools-->text importer,在出现的窗口中选择"Data from Textfile",然后再选择"Open data file", 在弹出的文件选择框中选中保存有数据的文本文件,此时将会看到data fr