数据库第5天

来源:互联网 发布:恒生期货软件使用方法 编辑:程序博客网 时间:2024/05/14 04:51
--约束(constraint)
--约束就是在数据表上强制执行的一些数据校验规则
--在执行DML操作时,数据必须符合这些规则,若不符合则无法进行操作

--约束种类(5个)
--1.非空约束  not null      简称NN    不能是NULL值
--2.唯一约束  unique        简称UK    不能重复,可以有NULL
--3.主键约束  primary key   简称PK    非空且唯一
--4.外键约束  foreign key   简称FK    要么是NULL,要么是主表关联字段内容
--5.检查约束  check         简称CK    根据条件进行约束

--1.非空约束
--建表时添加非空约束
  create table  my_emp(
    empno number(4),
    ename varchar(50) NOT NULL,
    hiredate date,
    salary number(6,2)
  );
insert into my_emp values(null,'LLS',null,null);
--建表之后添加非空约束
delete from my_emp;
alter table my_emp modify(hiredate date not null);
--建表之后取消非空约束
alter table my_emp modify(hiredate date null);

--2.唯一约束
--创建表时添加约束
drop table my_emp;
create table my_emp(
  empno number(4) constraint myemp_empno_uk unique,
  ename varchar(50),
  job varchar(50),
  constraint myemp_ename_uk unique(ename,job)
);
insert into my_emp values(1,'LLS1','PE');
insert into my_emp values(3,'LLS2','PE');
select * from my_emp;
--创建表之后添加约束
alter table my_emp add constraint myemp_job_uk unique(job);
--创建表之后取消约束
alter table my_emp drop constraint myemp_job_uk;
                                                                                                                                              
--3.主键约束
--做主键的字段,应该添加主键约束
--主键的作用是唯一确定一条数据记录

--主键字段选取规则:
--主键应对系统无意义的数据,只做唯一标识用,再无其他用途
--永远不会更新主键字段
--主键应该自动生成,不要人为干预,oracle序列实现
--主键不应该包含动态编号的数据:如:时间戳

--创建表时定义约束
drop table my_emp;
create table my_emp(
-- id number constraint myemp_id_pk primary key,
  id number,
  empno number(4),
  ename varchar(50),
  sal number(6,2)
--  ,constraint myemp_empnoid_pk primary key(empno,ename)
);
create sequence myemp_seq;
insert into my_emp values(1,2,null,9999.88);
--创建表之后添加约束
alter table my_emp add constraint my_emp_id_pk primary key(id);
--创建表之后取消约束
alter table my_emp drop constraint my_emp_id_pk;

--5.检查约束
--创建表时添加约束
drop table my_emp;
  create table  my_emp(
    id number constraint my_emp_pk primary key,
    ename varchar(50) not null,
    job varchar(50) constraint my_emp_job_uk unique,
    sal number(6,2),
    constraint my_emp_sal_ck check(sal>2000)
  );
insert into my_emp values(myemp_seq.nextval,'LLS','LRS',2800);
--建表之后添加和删除约束同 unique/primary key

--5.外键约束
--外键约束条件定义在两个表的字段或一个表中两个不同字段,
--用于保证相关两个字段的关系。
--比如:emp表中的deptno列参照dept表的deptno列
--则dept称为主表(父表),emp称为从表(子表),外键约束需要加在emp的deptno字段上
--emp的deptno字段要么存放的NULL,要么是dept的deptno列的内容
--主表关联字段必须是唯一字段(unique/primary key)
--外键约束字段取值,受限于主表中某个唯一字段的取值
--先创建主表,再创建从表/先插入主表,再插入从表
create table my_dept(
  deptno number(4) primary key,
  dname varchar2(50),
  loc varchar2(50)
);
insert into my_dept values(10,'开发部','dalian');
insert into my_dept values(20,'财务部','shenyang');
insert into my_dept values(30,'行政部','beijing');
select * from my_dept;
drop table my_emp;
create table my_emp(
  empno number(4),
  ename varchar2(50),
  deptno number(4) constraint my_emp_deptno_fk references my_dept(deptno)
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
insert into my_emp values(1003,'LLS3',null);
insert into my_emp values(1001,'LLS3',40);
--当主表参照列的值被从表参照时,主表的该行记录不允许被删除
delete from my_dept where deptno=10;
--也不能修改参照字段已被参照记录的值
update my_dept set deptno=40 where deptno=10;
--未参照的字段可以被删除或修改
delete from my_dept where deptno=30;
--不能直接删除主表,一般,先删除从表,再删除主表
--但是可以通过 cascade constraints 强制删除主表及关联外键约束
drop table my_dept cascade constraints;
--cascade 级联 一并 和 and

--也可以强制删除主表数据,通过在外键约束定义上添加级联删除或级联置空
--级联删除 on delete cascade
--在删除主表记录时,会关联删除从表对应的数据记录
drop table my_emp;
create table my_emp(
  empno number(4),
  ename varchar2(50),
  deptno number(4),
  constraint my_emp_deptno_fk
  foreign key(deptno)
  references my_dept(deptno)
  on delete cascade --级联删除
);
--级联置空 on delete set null
--删除主表的内容时,会将从表中关联的数据字段置空
drop table my_emp;
create table my_emp(
  empno number(4),
  ename varchar2(50),
  deptno number(4),
  constraint my_emp_deptno_fk
  foreign key(deptno)
  references my_dept(deptno)
  on delete set null --级联置空
);
insert into my_emp values(1001,'LLS',10);
insert into my_emp values(1002,'LLS2',20);
delete from my_dept where deptno=20;
select * from my_emp;
1 0
原创粉丝点击