oracle中的约束-----Not null、unique、primary key、foreign key和check的异同

本文详细介绍了Oracle数据库中的约束机制,包括非空(not null)、唯一(unique)、主键(primary key)、外键(foreign key)及检查(check)约束。探讨了不同约束的特点及其在表级与列级的应用。

oracle中的约束

数据完整性

        数据库不仅仅是存储数据,它也必须保证所保存的数据的正确性。如果数据不正确或不一致,那么该数据的完整性可能会遭到破坏,从而给数据库本身的可靠性带来意想不到的问题。

为了维护数据库中的数据完成性,在创建表时通常需要指定一些约束。通过表中的字段()定义约束,就可以防止非法数据的插入问题.对约束的定义可以再create table语句中进行,也可以在alter table语句中进行。

 

什么是约束呢?

         约束是表级的强制规定.根据约束的作用域,约束又可分为表级约束和列级约束两种。

列级约束是指是字段定义的一部分,只能够应用在一个列上.

表级约束是指独立于列的定义,可以应用于一个表中的多个列上。

oracle系统中定义约束时,通过constraint关键字为约束命名,如果用户没有为约束指定名称,系统会自动建立默认的名称。

 

总结:

  • 作用范围:列级约束只能作用在一个列上,而表约束可以作用在多个列上(当然表约束也可以作用在一个列上)。
  • 定义方式:列约束必须跟在列的定义里后面,表约束不与列一起,而是单独定义。
  • 非空(not null) 约束只能定义在列上

 

 

备注:在定义约束时,可以通过指定enabledisable关键字将约束的初始状态设置为激活或禁用状态,默认是激活状态。

 

定义约束的语法格式1

CREATE TABLE [schema.]table

             (column datatype [DEFAULT expr]

                   [column_constraint],

                   ...

                   [table_constraint][,...]);

 

列级约束:

  column [CONSTRAINT constraint_name] constraint_type,

表级约束

  column,...

  [CONSTRAINT constraint_name] constraint_type

  (column, ...),

 

约束的分类为:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK

1、 Not null

  如下:

  • 为字段定义not null 约束后,该字段不能为null
  • Not Null约束只能在列级定义
  • 在定义一个表中可以有多个not Null

2、 unique

特点如下:

  • 如果为字段定义了unique约束,该字段不能够包含重复值
  • unique约束既可以在列级定义,也可以在表级定义。
  • oracle系统中被定义的unique约束会自动建立一个唯一的索引。
  • 同一个字段既可以在其上定义为not null 也可以建立unique约束,(为某个字段可以添加多个约束),注意:如果在一个字段仅定义了unique约束,则该字段可以包含多个null

  

Unique主要的目的是:是在保证主键列外,其它列的唯一性。

3、  primary key

特点如下:

  • 定义为primary key的字段或字段组中不能包含重复值,并且不能为null.(即满足唯一性,不能为空)
  • 在一个表中只能定义一个primary key的约束
  • Oracle会自动为具有primarykey约束的字段添加一个唯一的索引,以及一个not null约束

4、   foreign key

特点如下:

  • 被定义了foreign key约束的字段的取值只能为相关表中引用的字段的值或null值。
  • foreign key约束既可以在列级定义,也可以在表级定义。
  • 定义了foreign key约束的外键字段和被引用的主键字段可以在同一张表中,这种情况称为:’自引用’(构成了自关联关系)
  • 对于同一个字段可以同时定义为foreign key约束和not null约束。

 

注意:外键的类型、尺寸等一定要与主键完全一致。

备注:

   oracle中级联删除有如下三值:

  • no action 在删除一方的情况下,对多方不进行任何操作.(不能删,删的情况会出现, 违反完整约束条件的异常信息
  • cascade 在删除一方的时,会把多方所有与1方关联的数据删除掉。
  • set null在删除一方的时,会把多方所有与1方关联的数据的字段值设置为null(注意:该字段必须允许为null 否则的话会出现无法更新*** NULL)

5、 check  

check约束是所有约束中最灵活的约束,也是最复杂的约束,check约束检查输入到表中的数据值来维护域的完整性,即检查输入的每一个数据,只有符合条件的数据才允许输入到表中.check约束有如下特点:

  • check约束的表达式中,必须引用表中一个或多个字段,并且表达式的运算结果必须是一个布尔值.
  • Check约束即可以在列级定义,也可以在表级定义
  • 对于同一个字段可以定义多个check约束,而且对于同一个字段可以定义check约束和not null约束。

 

  

 

SQL> create table stu(
  2    sname varchar2(20) primary key,
  3    stel varchar2(11) not null,
  4    semail varchar2(40),
  5    saddress varchar2(50)
  6  );
 
Table created
SQL> create table teacher(
  2     tname varchar2(20) primary key,
  3     tsex varchar2(2),
  4     ttitle varchar2(40),
  5     tage number(3) check(tage<100 and tage>20)
  6  );
 
Table created
SQL> create table stear(
  2     sid number(10) primary key,
  3     tname varchar2(20) references teacher(tname),
  4     sname varchar2(20) references stu(sname)
  5  );
 
Table created
SQL> commit;

 

 

<think>嗯,用户想了解Oracle数据库中PRIMARY KEYFOREIGN KEYUNIQUENOT NULL约束的作用。需要详细解释每个约束的概念、作用用法示例。 参考了站内四个引用资料,其中引用[1]明确了约束用于商业规则,列举了五种类型;引用[2][3][4]详细说明了每种约束的具体操作语法。准备结合这些资料组织回答: PRIMARY KEY部分要强调唯一标识NOT NULL特性,参考引用[1]的写法规范引用[3]的主键删除语法。补充示例时注意联合主键的写法,这是引用[2]提到的重点。 FOREIGN KEY解释需要突出引用完整性级联操作,引用[4]的外键添加语法很典型。考虑设计简单的部门-员工表示例来演示关系。 UNIQUE约束区分其与主键的异同点,引用[2][3]都提到允许空值的特性值得说明。NOT NULL则是最基础的约束类型。 在语法展示上,引用[2]的创建/修改表两种定义方式很实用,准备都采用。约束管理部分考虑补充启用禁用操作,引用[3]的相关语法可以作为参考。 最后生成的问题要覆盖到用户可能的进阶需求:约束冲突排查、性能影响、设计规范等。引用[2]里提到的禁用约束操作也可以作为问题方向。 </think>以下是对 Oracle 数据库中四种核心约束的详细解释及作用说明,结合语法示例: --- ### **1. PRIMARY KEY(主键约束)** * **作用**: 唯一标识表中的每一行(确保 `唯一性`),且不允许为 `NULL`(确保 `非空`)。一个表只能有一个主键(可以是单列或多列组合)。 * **关键特性**: - 自动创建唯一索引加速查询 - 强制实体完整性(每一行可唯一区分) * **语法示例**: ```sql -- 创建表时定义单列主键 CREATE TABLE employees ( emp_id NUMBER PRIMARY KEY, -- 列级定义 name VARCHAR2(50) ); -- 创建表时定义联合主键 CREATE TABLE orders ( order_id NUMBER, product_id NUMBER, CONSTRAINT pk_orders PRIMARY KEY (order_id, product_id) -- 表级定义 ); -- 修改表时添加主键 ALTER TABLE departments ADD CONSTRAINT pk_dept PRIMARY KEY (dept_id); ``` --- ### **2. FOREIGN KEY(外键约束)** * **作用**: 维护表之间的引用完整性,确保子表(从表)中的列值必须在主表(父表)的主键或唯一键列中存在,或为 `NULL`。 * **关键特性**: - 防止无效数据插入子表 - 可定义级联操作(如 `ON DELETE CASCADE` 自动删除子表关联行) * **语法示例**: ```sql -- 创建表时定义外键 CREATE TABLE employees ( emp_id NUMBER PRIMARY KEY, dept_id NUMBER, CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id) -- 关联父表主键 ON DELETE SET NULL -- 父表删行时子表外键置NULL ); -- 修改表时添加外键 ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (cust_id) REFERENCES customers(cust_id); ``` --- ### **3. UNIQUE(唯一约束)** * **作用**: 确保列(或列组合)的值在表中 `唯一`,但允许存在多个 `NULL` 值(OracleNULL 不参与唯一性比较)。 * **与主键区别**: - 一个表可有多个唯一约束 - 唯一约束列允许 `NULL` 值 * **语法示例**: ```sql -- 创建表时定义单列唯一约束 CREATE TABLE products ( product_id NUMBER PRIMARY KEY, serial_no VARCHAR2(20) UNIQUE -- 列级定义 ); -- 修改表时添加多列组合唯一约束 ALTER TABLE students ADD CONSTRAINT uk_student_email UNIQUE (student_id, email); -- 学号+邮箱组合唯一 ``` --- ### **4. NOT NULL(非空约束)** * **作用**: 强制列不允许存储 `NULL` 值,确保数据的必填性。 * **关键特性**: - 是最基础的完整性约束 - 只能在列级定义(无法在表级定义) * **语法示例**: ```sql -- 创建表时定义 CREATE TABLE customers ( cust_id NUMBER PRIMARY KEY, cust_name VARCHAR2(100) NOT NULL, -- 姓名必填 phone VARCHAR2(20) -- 允许NULL ); -- 修改表时添加 ALTER TABLE orders MODIFY (order_date DATE NOT NULL); ``` --- ### **约束管理参考** - **查看约束**: ```sql SELECT constraint_name, constraint_type FROM user_constraints WHERE table_name = 'EMPLOYEES'; ``` - **禁用/启用约束**(维护时临时关闭验证)[^3]: ```sql ALTER TABLE orders DISABLE CONSTRAINT fk_orders_customer; -- 禁用 ALTER TABLE orders ENABLE CONSTRAINT fk_orders_customer; -- 启用 ``` - **删除约束**: ```sql ALTER TABLE employees DROP CONSTRAINT pk_emp; ``` > 总结:这些约束共同保障数据的 **准确性**(如 `NOT NULL`)、**唯一性**(如 `PRIMARY KEY`, `UNIQUE`) **关联性**(如 `FOREIGN KEY`),是数据库设计的关键机制[^1][^2][^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值