Oracle中约束条件

2024-01-13 07:38
文章标签 oracle 约束条件

本文主要是介绍Oracle中约束条件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每个标题都默认表先drop table后create table
1.not null 非空约束
create table person(pid number,name varchar2(20) not null
);
insert into person(pid,name) values(1,'zhangsan');--成功插入
--错误的数据,会收到约束限制,无法插入。
2.primary key 主键约束
create table person(pid number primary key,name varchar2(20)
);
insert into person(pid,name) values(1,'zhangsan');--成功插入
insert into person(pid,name) values(1,'lisi');--主键重复了,插入失败
3.unique 唯一约束,值不能重复(空值除外)
电话不重复
create table person(pid number primary key,name varchar2(20),tel varchar2(20) unique
);
insert into person(pid,name,tel) values(1,'zhangsan','1234567890');--成功插入
insert into person(pid,name,tel) values(2,'lisi','1234567890');--电话重复,操作失败
4.check 条件约束,插入的数据必须满足某些条件
例如限制年龄的输入
create table person(pid number primary key,name varchar2(20),tel varchar2(20) not null unique,age number check(age between 0 and 150)
);
insert into person(pid,name,tel) values(1,'zhangsan','1234567890',30);--成功插入
insert into person(pid,name,tel) values(2,'lisi','1111111',160);--年龄输入错误
5.foreign key 外键
例如:有以下一种情况:一个人有很多本书
create table book(
bid number primary key not null,
name varchar2(30),
--书应该属于一个人
pid number
);
如果使用了以上的表直接创建,则插入下面的记录有效:
insert into book(bid,name,pid) values(1001,'oracle',15);
以上的代码没有任何错误但是没有意思,因为一本书应该只属于一个人,所以在此处的pid应该对应person表中的记录。
此时就需要外键,修改book表结构
create table book(bid number primary key not null,name varchar2(30),--书应该属于一个人pid number references person(pid) on delete cascade --on delete cascade级联删除--建立约束:book_pid_fk,与person表中pid为主-外键关系--constraint book_pid_fk foreign key(pid) references person(pid)
);
insert into book(bid,name,pid) values(1001,'oracle',15);
6.级联删除
接上面5的案例,如果一个人的人员信息没有了,那么此人所拥有的书还应该存在么?
正常来说,如果person中的一条信息没有了,则对应的book中的数据也应该同时消失。
在之前的结构上执行delete语句,删除person表中一条记录:
delete from person where pid=12;
提示删除失败:因为book中存在此项的关联,如果person表中的一条数据删除了,则一定会影响到book表中数据的完成性,
所以不让删除。
如果非要删除,则应该删除book表中的对应数据,之后再删除person表中对应的数据。
此时如果想完成删除person表的数据同时删除book表中的数据,则必须使用级联删除。
在建立外建的时候必须指定级联删除(on delete cascade)
create table book(bid number primary key not null,name varchar2(50),--书应该属于一个人pid number,--建立约束,book_pid_fk,与person表中pid为主-外键关系CONSTRAINT book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) on delete cascade
);
为新表添加约束条件
--person
create table person(pid number,name varchar2(30),tel varchar2(50),age number
);
--book
create table book(bid number,name varchar2(30),pid number
);
以上两张表中没有任何约束,下面通过alter命令为表添加约束
1.为两个表添加主键
person表pid为主键
alter table person add constraint person_pid_pk primary key(pid);
book表bid为主键
alter table book add constraint book_bid_pk primary key(bid);
2.为person表中的tel添加唯一约束
alter table person add constraint person_tel_uk unique(tel);
3.为person表中的age添加检查约束
alter table person add constraint person_age_ck check(age between 0 and 150);
4.为book表中的pid添加与person的主--外键约束,要求带级联删除
alter table book add constraint person_book_pid_fk foreign key(pid) references person(pid) on delete cascade;

7.删除约束

alter table person drop constraint unique(tel);
alter table book drop constraint person_book_pid_fk;
8.启用约束
alter table book enable constraint person_book_pid_fk;
9.禁用约束
alter table book disable constraint person_book_pid_fk;
练习:
1.创建一张表student
id number
name varchar2(20)
age number(5)
tel varchar2(15)
给id字段添加主键约束
给name字段添加非空约束
给age字段添加check约束(18-35)
给tel添加唯一非空约束
create table student(id number primary key,name varchar2(20) not null,age number(5) check(age between 18 and 35),tel varchar2(15) unique not null
);
2.创建一张学员兴趣表hobby
id number(10)
hobby_name varchar2(20)
sid number --学生id
给sid字段添加外键约束,并且要带级联删除
create table hobby(id number(10),hobby_name varchar2(20),sid number references student(id) on delete cascade
);
3.删除掉student表中tel字段的唯一约束(先写出查看该表约束的sql)
select constraint_name,constraint_type from all_constraints where user_table=upper('student');
alter table student drop constraint unique(tel);
4.手动添加student表中tel字段的唯一约束(约束名为:my_constraint_1)
alter table student add constraint my_constraint_1 unique(tel);
5.禁用约束my_constraint_1
alter table student disable constraint my_constraint_1;
6.启用约束 my_constraint_1
alter table student enable constraint my_constraint_1;

这篇关于Oracle中约束条件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600693

相关文章

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

Oracle Start With关键字

Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, 有一种比较常见得 设计模式, 层级结构 设计模式, 具体到 Oracle table中, 字段特点如下: ID, DSC, PID; 三个字段, 分别表示 当前标识的 ID(主键), DSC 当

oracle分页和mysql分页

mysql 分页 --查前5 数据select * from table_name limit 0,5 select * from table_name limit 5 --limit关键字的用法:LIMIT [offset,] rows--offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。   oracle 分页 --查前1-9

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

Oracle主键和外键详解及实用技巧

在 Oracle 数据库中,主键(Primary Key)和外键(Foreign Key)用于维护数据库表之间的数据完整性。 1. 主键(Primary Key) 主键是一列或多列,能够唯一标识表中的每一行。表中只能有一个主键,并且主键列不能为空(即 NOT NULL)。 特性: 唯一性:主键中的每一个值都是唯一的,不能重复。非空性:主键列不能包含 NULL 值。索引:Oracle 自动为

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT      [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]         FROM 'data_file'        [ WITH       (      [ [ , ] BATCHSIZE = batch_siz

Oracle start with connect BY 死循环

解决办法 检查start with前有没有where条件, 如果有的话,套一层select,再 Oracle start with connect BY

Java调用Oracle存储过程一

一、通过PL/SQL工具连接上Oracle数据库,创建表zx_test_procedure 二、创建存储过程 ①无返回值的存储过程 存储过程为: create or replace procedure testa (para1 in varchar2,para2 in varchar2) as begin insert into zx_test_procedure(i_id,i_n

PL/SQL工具创建Oracle数据库表,实现id字段的自动递增

通过PL/SQL工具,创建Oracle数据库表,如何实现字段ID自动递增; Oracle的自增需要依靠序列和触发器共同实现 比如:先创建一个表 create table test (id int primary key, name varchar2(10)); 创建一个序列 create sequence test_seq increment by 1 start with 1  min