表虽然建好了,但是表中的数据是否合法并不能有所检查,如果想针对表中的数据做一些过滤的话,则可以通过约束完成,以保证数据的合法性。
一个有五种:非空约束、唯一约束、主键约束、检查约束、外键约束。
非空约束 :NK
列名 数据类型 [DEFAULT ] NOT NULL ;
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL
);
INSERT INTO mumber (mid,name) VALUES(1,'中国');
INSERT INTO mumber (mid,name) VALUES(2,'美国');
INSERT INTO mumber (mid,name) VALUES(3,'日本');
INSERT INTO mumber (mid,name) VALUES(4,null);
|
错误信息:ORA-01400: 无法将 NULL 插入 ("SCOTT"."MUMBER"."NAME")
|
唯一约束: (UNIQUE)UK
email VARCHAR2(50) UNIQUE;
错误信息少,因为没有为约束指定一个名字。可以使用一下CONSTRAINT完成
CONSTRAINT UK_email UNIQUE(email);
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
email VARCHAR2(30) UNIQUE
);
INSERT INTO mumber (mid,name,email) VALUES(1,'中国','aaa@qq.com');
INSERT INTO mumber (mid,name,email) VALUES(2,'中国','aaa@qq.com');
错误:ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C005284)
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
email VARCHAR2(30),
CONSTRAINT UK_email UNIQUE(email)
);
再次插入数据
错误:ORA-00001: 违反唯一约束条件 (SCOTT.UK_EMAIL)
主键约束(Primary Key):PK
主键约束 = 非空约束 + 唯一约束。作为数据的唯一标识,如人员的ID
一般一个表只设置一个主键。两个主键称为复合主键。
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER PRIMARY KEY,
name VARCHAR2(50) NOT NULL
);
INSERT INTO mumber (mid,name) VALUES(1,'中国');
INSERT INTO mumber (mid,name) VALUES(1,'美国');
错误:ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C005288)
设置为:
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT UK_mid PRIMARY KEY(mid)
);
插入报错: ORA-00001: 违反唯一约束条件 (SCOTT.UK_MID)
复合主键设置: 只有多个主键都重复才叫重复数据
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT UK_mid_name PRIMARY KEY(mid,name)
);
检查约束:(Check)CK
检查为表中的数据增加一些过滤条件,
例如:设置年龄范围 0-250,性别只能是男女
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
sex VARCHAR2(50),
age NUMBER,
CONSTRAINT UK_mid PRIMARY KEY(mid),
CONSTRAINT CK_sex CHECK(sex IN ('男','女')),
CONSTRAINT CK_age CHECK(age BETWEEN 0 AND 250)
INSERT INTO mumber (mid,name,sex,age) VALUES(1,'凤姐','人妖',200);
|
ORA-02290: 违反检查约束条件 (SCOTT.CK_SEX)
|
);
主-外键约束
在多表中进行的关联,比如一个人(主表)又多本书(父表),书只能属于一个人,也就是说字表中的字段取值只能由父表决定。
首先建立两张表:
DROP TABLE mumber PURGE;
DROP TABLE book PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
bid NUMBER,
name VARCHAR2(50) NOT NULL,
mid NUMBER,
CONSTRAINT PK_bid PRIMARY KEY(bid)
) ;
添加数据
INSERT INTO mumber (mid,name) VALUES(1,'aaa');
INSERT INTO book(bid,name,mid) VALUES(31,'java',2);
此时book表中的mid可以取任意值,不符合规择,在book表中添加外键约束,使book.mid 只能是mumber表中的mid
创建book表时在后面添加:
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES mumber(mid);
再次在book表中添加父表没有的字段 报错:
ORA-02291: 违反完整约束条件 (SCOTT.FK_MID) - 未找到父项关键字
|
引入外键约束后同时也带来几个问题:
1.删除父表数据的时候,如果有字表与之对应,则不能删除
ORA-02292: 违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录
|
DELETE FROM mumber WHERE mid = 1;
此时只能先删除字表中的数据。
不方便,因为删除记录的时候还有顺清表关系。
解决方法:
(1)删除父表字段的时候把字表对应的内容也删除
在建立字表book的时候使用:
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES mumber(mid) ON DELETE CASCADE;
DROP TABLE book PURGE;
DROP TABLE mumber PURGE;
CREATE TABLE mumber (
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT PK_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
bid NUMBER,
name VARCHAR2(50) NOT NULL,
mid NUMBER,
CONSTRAINT PK_bid PRIMARY KEY(bid),
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES mumber(mid) ON DELETE CASCADE
) ;
此时删除父表中的字段的时候子表中的字段也会删除。
(2)删除父表字段的时候把字表对应字段设为null
CONSTRAINT FK_mid FOREIGN KEY(mid) REFERENCES mumber(mid) ON DELETE SET NULL
2.删除表时要删除字表,否则无法删除。
DROP TABLE mumber PURGE;
第 1 行出现错误:
ORA-02449: 表中的唯一/主键被外键引用
|
解决办法:在删除语句后面加上CASCADE CONSTRAINT
DROP TABLE mumber CASCADE CONSTRAINT PURGE;
此时不关心字表是不是存在,直接强制性删除父表,但此时字表中的数据还存在。
合理做法:先删除字表,再删除父表。
修改约束(了解)
约束也属于数据库对象,也是用ALTER指定
为表添加约束:
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称,约束类型(字段)
如果表中已经存在非法数据,则无法添加约束。
删除约束:
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称
非空约束作为一个特殊的约束无法操作。
查询约束:
如果想知道有哪些约束,可以直接查询user_constraints 数据字典。
SELECT * FROM user_constraints;
此时的约束只有一个名字,没有告诉是哪个字段上的约束。查看另一张数据字典表:
user_cons_columns;
分享到:
相关推荐
Oracle 约束错误约束错误 Oracle 中的约束错误是指在数据库中违反了约束条件,导致数据无法修改或删除的错误。这种错误通常发生在父表和子表之间存在关联关系时,试图删除或修改父表中的记录,但子表中存在对应的...
### Oracle约束详解 在Oracle数据库管理系统中,约束是用于确保数据完整性和一致性的规则或条件。这些约束可以被定义在表级别的字段上,用来限制存储在表中的数据类型。通过实施约束,我们可以确保数据的质量,并...
Oracle约束和索引是数据库设计和优化的核心概念。通过正确地应用约束,可以确保数据的准确性和一致性;而合理地创建和管理索引,则能够显著提升查询速度,提高整体系统性能。作为数据库管理员或开发者,理解和熟练...
Oracle约束详解
本文将深入探讨Oracle约束的基本语法以及如何修改表结构。 首先,Oracle约束可以分为五种类型: 1. **NOT NULL约束**:不允许字段值为空,确保了字段必须有值。 2. **UNIQUE约束**:确保字段中的值是唯一的,但...
Oracle约束是数据库管理系统中用于确保数据完整性的重要机制。在Oracle数据库中,约束主要分为三类:域完整性、实体完整性和参照完整性。 1. 域完整性(Domain Integrity): 域完整性关注的是单个列的数据有效性...
### Oracle新手入门指导之五——Oracle约束 #### 约束概述 在Oracle数据库中,约束是一种用于确保数据完整性的机制。它可以帮助我们定义表中的列必须满足的规则,从而确保数据的一致性和准确性。Oracle提供了多种...
Oracle约束键解析主要涉及到数据库设计中的关键概念,用于确保数据的完整性和一致性。本文将详细介绍四种主要的约束类型:主键约束(Primary Key)、唯一约束(Unique)、外键约束(Foreign Key)和检查约束(Check...
Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,它提供了丰富的数据完整性约束来确保数据的准确性和一致性。在Oracle中,约束是定义在表上的规则,用于限制可以存储在表中的数据类型和值。以下是对Oracle...
### Oracle约束总结 在Oracle数据库中,为了确保数据的一致性和完整性,我们常常需要使用到各种类型的约束。本文将详细地介绍Oracle中的五种主要约束类型:非空(NOT NULL)、唯一(UNIQUE)、主键(PRIMARY KEY)...
1 1 、 e oracle 数据库有 5 5 种约束: :y primary n key,foreign key,unique,check,not null 2 2 、 如果某个约束只作用单独的字段,即可以在列级定义约束;也可以在表 级定义约束。但是如果某个约束作用于多...
Oracle约束是数据库设计中的关键元素,用于确保数据的完整性和一致性。在Oracle数据库系统中,约束是用来限制可以插入或更新到表中的数据类型和值。它们是预防性地确保数据质量的规则,防止意外的数据输入错误或不...
详细介绍了oracle的常见约束,表级约束(主键),列级约束,唯一性约束,外键约束,并介绍了如何给相应的约束命名
正在看的ORACLE教程是:Oracle约束管理脚本。作为一个Oracle数据库管理员,会碰到这样的数据库管理需求,停止或者打开当前用户(模式)下所有表的约束条件和触发器。这在数据库的合并以及对数据库系统的代码表中某些...
总之,Oracle约束是数据库设计的关键组成部分,它们帮助维护数据的准确性和一致性,防止错误数据的输入。理解并熟练使用这些约束对于构建健壮的数据库结构至关重要。学习和掌握约束的使用,可以帮助我们更好地设计和...