Oracle笔记之约束

约束用于保证数据库中某些数据的完整性,给某一列添加一个约束可以保证不满足约束的数据是绝对不会被接受的。

约束主要有那么五种类型:非空约束、唯一约束、主键约束、外键约束、校验约束。

使用如下命令检索某个表上的所有约束(需要注意WHERE条件中的表名和用户名需要大写,不然检索不到):

SELECT *
FROM all_constraints
WHERE table_name = ‘T_USER‘ AND owner = ‘SCOTT‘; 

结果如下:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005264                    C               T_ORDER                        "USER_ID" IS NOT NULL                                                                                                                                      ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1
SCOTT                          SYS_C005266                    R               T_ORDER                                                                                                         SCOTT                          SYS_C005258                    NO ACTION   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1

对于上面的CONSTRAINT_NAME,如果在创建的时候不指定的话Oracle就会自动生成一个,自动生成的不能见名知义鬼知道什么意思...

对于上面的CONSTRAINT_TYPE:

C:校验约束,表

O:只读约束

P:主键约束

R:外键约束

U:唯一约束

V:校验约束,视图

使用下面这个命令查看列级别的约束:

SELECT * FROM user_cons_columns WHERE CONSTRAINT_NAME=‘FK_ORDER_USER‘;

列级约束定义:在定义列的时候定义的约束。

表级约束定义:在列定义完之后再定义的约束,注意这里并不一定是表创建完成之后,只要在列声明完事之后再声明的就算是表级定义。

列级的定义不能自己取约束名,Oracle会自动生成,自动生成的约束名类似这个样式的:SYS_C005271,一点也不友好啊,使用表级约束定义可以自己指定一个见名知义的约束名。

举个例子说明列级定义和表级定义:

列级定义主键:

CREATE TABLE t_user(
	id INT PRIMARY KEY
);

表级定义主键:

CREATE TABLE t_user(
	id INT ,
	CONSTRAINT PK_USER_ID PRIMARY KEY (id)
);

约束的类型

非空约束(NOT NULL )

任何列都可以赋予一个NOT NULL约束,授予非空约束的列在插入数据的时候必须有数据,对于字符串类型的列,如果没有值可插入但是又有非空约束的话,那么传入一个空串即可,同理,对于数据类型的可以用0表示NULL,只要在业务上别有歧义。

设置非空约束是很有必要的,比如对于一些经常在WHERE条件中用到的被检索的字段如果有NULL的话就不能使用索引了。

创建表的时候指定非空约束:

CREATE TABLE t_user(
	id INT PRIMARY KEY ,
	username VARCHAR2(50) NOT NULL
);

查看t_user表中的约束:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005271                    C               T_ORDER                        "USERNAME" IS NOT NULL                                                                                                                                     ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1
SCOTT                          SYS_C005272                    P               T_ORDER                                                                                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1                                SYS_C005272

一个C非空约束,一个P主键约束,为啥是C呢,因为这样啊:

username VARCHAR2(50) NOT NULL == username VARCHAR2(50) CHECK(username IS NOT NULL)

NOT NULL实际上就相当于添加了一个IS NOT NULL的CHECK。

表创建完毕再增加非空约束:

ALTER TABLE t_user MODIFY username NOT NULL;

删除非空约束:

ALTER TABLE t_user MODIFY username NULL;

唯一约束(UNIQUE)

如果将某个列设置为唯一,那么列中每行的数据不能重复,虽然不能重复,但是可以为null。

创建表的时候指定唯一约束:

CREATE TABLE t_user(
	id INT PRIMARY KEY ,
	username VARCHAR2(50) ,
	email VARCHAR2(255) UNIQUE
);

查看t_user上的约束:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_USER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005280                    U               T_USER                                                                                                                                                                                    ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 2                                SYS_C005280
SCOTT                          SYS_C005279                    P               T_USER                                                                                                                                                                                    ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 2                                SYS_C005279

一个唯一约束,一个主键约束。

在创建完表之后再添加唯一约束:

ALTER TABLE t_user ADD CONSTRAINT U_EMAIL UNIQUE(email); 

删除表中的唯一约束:

ALTER TABLE t_user DROP CONSTRAINT SYS_C005280;

主键约束(PRIMARY KEY)

1. 主键列是非空且唯一的,相当于NOT NULL+UNIQUE

2. 每个表中最多可以有一个主键约束。

3. 主键约束可以由表中的一个列或多个列组成,多个列的话称之为复合主键。

4. 主键属于表对象,所以主键有一个对象,若没有给主键指定名字,Oracle会自动分配一个唯一的名字

创建表的时候指定主键:

CREATE TABLE t_user(
	id INT PRIMARY KEY
);

创建复合主键:

CREATE TABLE t_user(
	id INT ,
	business_id INT ,
	CONSTRAINT PK_USER PRIMARY KEY (id, business_id)
);

注意复合主键只能使用表级约束定义,因为没有办法在一个列上使用两个列啊...

表创建完成之后再指定主键:

ALTER TABLE t_user
ADD CONSTRAINT PK_USER_ID PRIMARY KEY(id);

删除主键:

ALTER TABLE t_user DROP PRIMARY KEY;

在删除主键的时候可能会有错误,比如某张表的主键已经是别的表的外键了,那么尝试删除父表的时候就会报错。

来建立一个主外键关系:

DROP TABLE t_user;
CREATE TABLE t_user(
	id INT PRIMARY KEY
);

DROP TABLE t_order;
CREATE TABLE t_order(
	id INT PRIMARY KEY ,
	user_id INT REFERENCES t_user(id)
);

t_order已经有一个外键指向了t_user的主键,尝试删除t_user的主键:

SQL> ALTER TABLE t_user DROP PRIMARY KEY;
ALTER TABLE t_user DROP PRIMARY KEY
ORA-02273: 此唯一/主键已被某些外键引用

正确的姿势上加上CASCADE,表示将外键主从关系一并删除掉:

ALTER TABLE t_user DROP PRIMARY KEY CASCADE;

再查看t_order表的约束关系:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005284                    P               T_ORDER                                                                                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 2                                SYS_C005284

只剩下一个主键约束了,外键约束已经被删除掉了。

外键约束(FOREIGN KEY)

1. 外键约束是为数据库中某个与其它表有关系的表而定义的。

2. 外键的值必须先出现在某个特定表的主键列或者有唯一约束的列中。

3. 外检的列可以包含NULL。

4. 一个表中外键可以有多个。

先创建一个用户表:

CREATE TABLE t_user(
	id INT PRIMARY KEY ,
	name VARCHAR2(50) NOT NULL
);

再创建一个订单表,链接到订单表:

CREATE TABLE t_order(
	id INT PRIMARY KEY ,
	user_id INT REFERENCES t_user(id) NOT NULL
);

查看t_order表的约束:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005268                    P               T_ORDER                                                                                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1                                SYS_C005268
SCOTT                          SYS_C005267                    C               T_ORDER                        "USER_ID" IS NOT NULL                                                                                                                                      ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1
SCOTT                          SYS_C005269                    R               T_ORDER                                                                                                         SCOTT                          SYS_C005258                    NO ACTION   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1

可以看到有三个约束,一个是主键,一个是外键,一个是外键列的非空。

对于已经创建完成的表,需要添加外键应该怎么办呢。

先删除上面t_order的外键约束:

ALTER TABLE t_order DROP CONSTRAINT SYS_C005269;

需要注意删除约束的时候需要传入约束的名字,对于自动生成的可以先去查询出然后再删除。

现在t_order表就俩约束了:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005268                    P               T_ORDER                                                                                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1                                SYS_C005268
SCOTT                          SYS_C005267                    C               T_ORDER                        "USER_ID" IS NOT NULL                                                                                                                                      ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1

来为其重新把外键约束添加上:

ALTER TABLE t_order
ADD CONSTRAINT FK_ORDER_USER FOREIGN KEY (user_id) REFERENCES t_user;

外键约束已添加上:

SQL> SELECT *
  2  FROM all_constraints
  3  WHERE table_name = ‘T_ORDER‘ AND owner = ‘SCOTT‘;
OWNER                          CONSTRAINT_NAME                CONSTRAINT_TYPE TABLE_NAME                     SEARCH_CONDITION                                                                 R_OWNER                        R_CONSTRAINT_NAME              DELETE_RULE STATUS   DEFERRABLE     DEFERRED  VALIDATED     GENERATED      BAD RELY LAST_CHANGE INDEX_OWNER                    INDEX_NAME                     INVALID VIEW_RELATED
------------------------------ ------------------------------ --------------- ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ----------- -------- -------------- --------- ------------- -------------- --- ---- ----------- ------------------------------ ------------------------------ ------- --------------
SCOTT                          SYS_C005268                    P               T_ORDER                                                                                                                                                                                   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1                                SYS_C005268
SCOTT                          SYS_C005267                    C               T_ORDER                        "USER_ID" IS NOT NULL                                                                                                                                      ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     GENERATED NAME          2017/6/15 1
SCOTT                          FK_ORDER_USER                  R               T_ORDER                                                                                                         SCOTT                          SYS_C005258                    NO ACTION   ENABLED  NOT DEFERRABLE IMMEDIATE VALIDATED     USER NAME               2017/6/15 1

校验约束(CHECK)

校验约束是一个布尔表达式,它的返回值是TRUE或者FALSE。

校验用于检查插入的数据是否合法,是“最后一层防线”(事实上还可以用触发器实现最后防线,即在插入数据后触发一个校验动作,不合法的话就抹掉它再报错)。

创建一个用户表:

CREATE TABLE t_user(
	id INT PRIMARY KEY ,
	name VARCHAR2(50) NOT NULL ,
	age INT NOT NULL
); 

为age字段添加一个检查约束:

ALTER TABLE t_user
ADD CONSTRAINT T_STUDENT_AGE_CHECK CHECK(age>=0 AND age<=100);

当然更优雅的写法是使用BETWEEN...AND...:

ALTER TABLE t_user
ADD CONSTRAINT T_STUDENT_AGE_CHECK CHECK(age BETWEEN 0 AND 100);

在WHERE中可以使用的,在CHECK表达式中都可以使用的。

创建表的时候添加校验约束:

CREATE TABLE t_user(
	id INT PRIMARY KEY ,
	name VARCHAR2(50) ,
	age INT CHECK(age BETWEEN 0 AND 128)
); 

表创建完毕添加校验约束:

ALTER TABLE t_user
ADD CONSTRAINT T_STUDENT_AGE_CHECK CHECK(age BETWEEN 0 AND 100);

删除校验约束:

ALTER TABLE t_user DROP CONSTRAINT T_STUDENT_AGE_CHECK ;

.

时间: 2024-09-28 16:42:56

Oracle笔记之约束的相关文章

Oracle笔记(十) 约束

Oracle笔记(十) 约束 表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性,按照约束的分类,一共有五种约束:非空约束.唯一约束.主键约束.检查约束.外键约束. 一.非空约束(NOT NULL):NK 当数据表中的某个字段上的内容不希望设置为null的话,则可以使用NOT NULL进行指定. 范例:定义一张数据表 DROP TABLE member PURGE; CREATE TABLE

Oracle笔记 目录索引

Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Oracle笔记 五.创建表.约束.视图.索引.序列.同义词.表空间 Oracle笔记 六.PL/SQL简单语句块.变量定义 Oracle笔记 七.PL/SQL 异常处理 Oracle笔记 八.PL/SQL跳转/判断/循环语句块 Oracle笔记 九.PL/SQL 游标的使用 Oracle笔记 十.PL

转:oracle笔记

oracle笔记1 卸载oracle developer server的方法: 1-1 oracle卸载工具中卸载对应的oracleds项目:在注册表中搜索ORACLEDS HOME对应的别名,删除对应的项:重新启动计算机:删除对应的ORACLEDS的安装目录: 2jinitiator的相关问题: 2-1 jinitiator是oracle自己的applet viewer工具: 2-2 在第一次打开web应用程序时会自动提示安装该程序,如果不安装则无法打开程序: 2-3 jinitiator是在

20140523 Oracle笔记

Oracle练习: 创建表格: create table customer_info(id int primary key not null,first_name varchar(20),last_name varchar(20),sex char(2),age char(3)); 创建序列:参考资料 http://zhidao.baidu.com/question/82436743.html create sequence id_seq minvalue 1 maxvalue 10000000

Oracle笔记(六) 多表查询

Oracle笔记(六) 多表查询 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一.多表查询的基本概念 在之前所使用的查询操作之中,都是从一张表之中查询出所需要的内容,那么如果现在一个查询语句需要显示多张表的数据,则就必须应用到多表查询的操作,而多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名]

Oracle笔记(十一) 建表、更新、查询综合练习

Oracle笔记(十一) 建表.更新.查询综合练习 有某个学生运动会比赛信息的数据库,保存了如下的表: 运动员sporter(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系号department) 项目item(项目编号itemid,项目名称itemname,项目比赛地点location) 成绩grade(运动员编号id,项目编号itemid,积分mark) 请用SQL语句完成如下功能: 1.  建表,并在相应字段上增加约束: 定义各个表的主键和外键约束: 运动员的姓

Oracle笔记(十三) 视图、同义词、索引

Oracle笔记(十三) 视图.同义词.索引 一.视图 在之前所学习过的所有的SQL语法之中,查询操作是最麻烦的,如果程序开发人员将大量的精力都浪费在查询的编写上,则肯定影响代码的工作进度,所以一个好的数据库设计人员,除了根据业务的操作设计出数据表之外,还需要为用户提供若干个视图,而每一个视图包装了一条条复杂的SQL语句,视图的创建语法如下: CREATE [OR REPLACE] VIEW 视图名称 AS 子查询; 范例:创建一张视图 CREATE VIEW myview AS SELECT

Oracle 笔记:PLSQL无法连接64位Oracle 解决方法

Plsql打开后提示错误,登录界面无连接目标选择. 原因:PLSQL本身好像就不支持64位的Oracle. 解决方法: 到Oracle 官网下载32位的 Oracle 客户端,地址为 http://www.oracle.com/technetwork/topics/winsoft-085727.html 解压下载的32位客户端即可. PLSQL登录界面暂时取消登录,先进入PLSQL界面,点击首选项,设置OCI库为刚才下载的32位客户端的OCI路径,路径中一定要包含 oci.dll . 添加环境变

Oracle笔记之权限管理

权限管理 1,默认的三个用户 2,创建用户 3,授权,撤销权限 4,系统权限与对象权限 5,角色 6,通过角色对权限进行管理 7,权限的传递,丢失管理员密码怎么办 3个默认的用户 用户名        密码 sys            change_on_install system      manager scott          tiger cmd 进入命令行 sqlplus / as sysdba; 或者 sqlplus sys/change_on_install as sysdb