数据库第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;
--约束就是在数据表上强制执行的一些数据校验规则
--在执行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
- 数据库第5天
- 数据库第1天
- 数据库第2天
- 数据库第3天
- 数据库第4天
- 数据库:第5周作业
- 第三天-第3天-数据库操作-表创建
- java基础第26天 数据库
- 坚持#第252天~开始数据库啦
- 数据库原理选择题总结(第5章)
- 第 5 章 使用数据库管理资源
- 第5章 数据库完整性(数据库系统概论)
- SQLite数据库第一天
- 数据库学习第一天
- 数据库调第一篇
- 第三次数据库作业
- 数据库学习第一篇
- 数据库第一天
- 【BZOJ4009】[HNOI2015]接水果
- Circular Sequence UVA
- 数据库第4天
- PHP递归遍历目录,递归删除目录及文件
- Cube painting UVA
- 数据库第5天
- 蓝桥 打印图形
- Material Design之RippleDrawable详解
- 【Linux init】systemd 服务单元管理
- 算法导论B树
- Python笔记-类和实例、继承和多态
- Spreadsheet Tracking
- Python爬虫之——爬取妹子图片
- # VMWARE上的 RHEL 7扩展lv