SQL語句複習【專題七】

SQL語句複習【專題七】測試

完整性約束分類
1)域完整性約束(非空not null,檢查check)
2)實體完整性約束(惟一unique,主鍵primary key)
3)參照完整性約束(外鍵foreign key)spa

域完整性約束:學生的名字、學生的年齡、學生性別。
實體完整性約束:email,學號。
參照完整性約束:某一列的值必須是其餘的表的 主鍵。對象

命名規則推薦採用:約束類型_約束字段
1)非空約束  NN_表名_列名
2)惟一約束  UK_表名_列名
3)主鍵約束  PK_表名
4)外鍵約束  FK_表名_列名
5)檢查約束  CK_表名_列名開發

1:約束相關【建立表的時候添加約束】
---【主鍵約束】 primary key
drop table student purge;
create table student(
--sno varchar2(6) constraints pk_student primary key, -- 列級主鍵約束
sno varchar2(6),-- primary key,--簡單的列級主鍵約束。約束的名字系統自動生成。
sname varchar2(12),
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
--constraints pk_student primary key (sno)--表級添加約束
primary key (sno)--簡化的表級主鍵約束
);
insert into student values ('000001','林徽因',19,'女','c0001','bai@qq.com');
insert into student values (null,'林徽因',19,'女','c0001','bai@qq.com');
select * from studenttable

--【聯合主鍵約束】只有表級約束,沒有列級約束
drop table student purge;
--sno 和 sname 做爲聯合主鍵 兩個列的值的組合是惟一的 聯合主鍵的全部的字段都不能爲空
create table student(
sno varchar2(6),
sname varchar2(12),
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
constraints pk_student primary key (sno,sname)--表級添加約束
--primary key (sno,sname) 簡化的聯合主鍵約束
);
insert into student values ('000002','林徽因',19,'女','c0001','bai@qq.com');
insert into student values (null,'林徽因',19,'女','c0001','bai@qq.com');email

--【非空約束】not null
--ename 非空約束,只有列級
drop table student purge;
create table student(
sno varchar2(6),
--sname varchar2(12) ,--constraints nn_student_sname not null,--非空的列級約束
sname varchar2(12) not null,--簡化的非空約束
sage number(3),
sgender varchar2(3),
cno varchar2(10),
semail varchar2(20),
constraints pk_student primary key (sno)--表級添加約束
--constraints nn_student_sname not null(sname) 非空約束只能是列級約束,不能做爲表級約束
);
--插入測試數據
insert into student values ('000001',null,19,'女','c0001','bai@qq.com');
select * from studentselect

--【惟一約束】 unique
--email 惟一的。能夠是 null,並且能夠有多個 null
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--簡化的非空約束
sage number(3),
sgender varchar2(3),
cno varchar2(10),
--semail varchar2(20) constraints uk_student_semail unique, --列級 惟一約束
semail varchar2(20) ,--unique,--簡單列級 惟一約束
constraints pk_student primary key (sno),--表級添加約束
--constraints uk_student_email unique(semail)--表級的 惟一約束
unique (semail)--簡化的表級惟一約束
);
--插入測試數據
insert into student values ('000001','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小紅',19,'女','c0001',null);
insert into student values ('000003','小王',19,'女','c0001',null);
select * from student引用

--【檢查約束】 check
--控制域的取值範圍
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--簡化的非空約束
sage number(3),-- constraint ck_student_sage check (sage >=18 and sage <= 30),--[18-30]---列級檢查約束
sgender varchar2(3) default '男',-- check (sgender in ('男','女')) ,--列級簡化檢查約束
cno varchar2(10),
semail varchar2(20) ,
constraints pk_student primary key (sno),--表級添加約束
constraints uk_student_email unique(semail),--表級的 惟一約束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女'))
);
--插入測試數據
insert into student values ('000001','小白',19,'女','c0001','bai@qq.com');
insert into student values ('000002','小白',17,'女','c0001','bai@qq.com');
insert into student values ('000002','小紅',19,'fe','c0001',null);
insert into student values ('000003','小王',19,'女','c0001',null);
select * from studentim

--【外鍵約束】foreign key
--表中的某些列是其餘的表中的主鍵
--班級編號 是 班級表 的主鍵
--建立一張班級表
--主表:被引用字段的表,它的主鍵被其餘的表做爲外鍵使用。
--從表:使用其餘的表的主鍵做爲外鍵的表
create table clazz(
cno varchar2(6) primary key,
cname varchar2(20) unique,
cloc varchar2(30) not null
);
--插入測試數據
insert into clazz values('000001','京南508班','北京亦莊開發區');
insert into clazz values('000002','京南503班','北京亦莊開發區');
insert into clazz values('000003','西三旗302班','北京西三旗校區');
select * from clazz
drop table student purge;qq

create table student(
sno varchar2(6),
sname varchar2(12) not null,--簡化的非空約束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,-- references clazz (cno),
semail varchar2(20) ,
constraints pk_student primary key (sno),--表級添加約束
constraints uk_student_email unique(semail),--表級的 惟一約束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女')),
constraint fk_student_cno foreign key (cno) references clazz (cno)--外鍵的表級約束
-- foreign key (cno) references clazz (cno)--簡化的外鍵約束
);
--插入測試數據
insert into student values ('000001','小白',19,'女','000001','bai@qq.com');
insert into student values ('000002','小白',27,'女','000002','bai1@qq.com');
insert into student values ('000004','小紅',19,'女','c0001',null);
insert into student values ('000003','小王',19,'女','000003',null);
select * from student;

---2:約束相關【建立表以後添加約束】
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--簡化的非空約束 只能列級約束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,
semail varchar2(20)
--constraints pk_student primary key (sno),--表級添加約束
--constraints uk_student_email unique(semail),--表級的 惟一約束
-- check (sage between 18 and 30),
-- constraint ck_student_sgender check (sgender in ('男','女')),
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete cascade--外鍵的表級約束---設置級聯刪除
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete set null-----設置set null
);
select * from student

--建立表以後添加約束
--若是表中已經有數據違反了添加的約束,那麼約束不能添加,必須將數據清除掉才能添加
alter table student add constraints pk_student primary key(sno);
alter table student add constraints uk_student_email unique(semail);
alter table student add constraints ck_student_sgender check (sgender in ('男','女'));
alter table student add constraints ck_student_sage check (sage between 18 and 30);
alter table student add constraints fk_student_cno foreign key(cno) references clazz (cno) on delete set null
--刪除約束
alter table student drop constraints ck_student_sgender
insert into student values ('000004','小白',30,'fe','000002','bai12@qq.com');
delete student where sno='000004'

3:級聯刪除
---主表刪除字段 級聯刪除問題
--刪除主表的字段
--若是主表的字段沒有被從表使用,那麼能夠直接刪除。
delete from clazz where cno='000003'
---若是主表的字段有被從表使用,那麼不能夠直接刪除。 這只是一種默認的狀況。
delete from clazz where cno='000001'

--刪除主表的記錄,關於從表中的相關的記錄的處理的方式 一共有三種。
--1:默認的 RESTRICT:刪除受限制。若是從表中使用了某一個主表中的字段的值,那麼主表中的值不容許刪除。
--2:cascade:級聯刪除。若是主表中的某個記錄被刪除,那麼從表中對於該記錄的引用的記錄也一併刪除。
--3: set null : 若是主表中的 記錄被刪除掉,那麼從表中對於主表的該記錄的引用的相關的 內容 直接設置爲 null。
drop table student purge;
create table student(
sno varchar2(6),
sname varchar2(12) not null,--簡化的非空約束
sage number(3),
sgender varchar2(3) default '男',
cno varchar2(10) ,
semail varchar2(20) ,
constraints pk_student primary key (sno),--表級添加約束
constraints uk_student_email unique(semail),--表級的 惟一約束
check (sage between 18 and 30),
constraint ck_student_sgender check (sgender in ('男','女')),
-- constraint fk_student_cno foreign key (cno) references clazz (cno) on delete cascade--外鍵的表級約束---設置級聯刪除
constraint fk_student_cno foreign key (cno) references clazz (cno) on delete set null-----設置set null
);
insert into student values ('000001','小白',19,'女','000001','bai@qq.com');
insert into student values ('000003','小白',30,'女','000002','bai1@qq.com');
select * from student
--刪除主表的一行記錄
delete from clazz where cno='000001'

---刪除主表
--直接刪除主表,若是主表的某些記錄被從表所引用,那麼是不能刪除的。
drop table clazz
--將從表中的數據所有刪除
delete student
truncate table student
--即便從表中的數據沒有對主表的數據有任何的引用,那麼也不能直接刪除主表。約束對象對 主表是有引用的。
select * from clazz
--若是想直接刪除主表,那麼必須和主表相關的約束一併刪除。
--從表中相關的字段對主表的引用,不作任何的處理。
drop table clazz cascade constraints
select * from student

相關文章
相關標籤/搜索