Oralce的二维表操作
--创建表并同时添加约束
--主键约束
--非空约束
--检查约束
--唯一约束
--外键约束
--简单的表创建和字段类型
--简单的创建语句:
create table student(
sno number(10) ,--primary key
sname varchar2(100) ,--not null
sage number(3), --check(sage<150 and sage>0)
ssex char(4) ,--check(ssex='男' or ssex='女')
sfav varchar2(500),
sbirth date,
sqq varchar2(30) --unique
--constraints pk_student_sno primary key(sno)--添加主键约束
--constraints ck_student_sname check(sname is not null)--非空约束
--constraints ck_student_sage check(sage<150 and sage>0)--检查约束
--constraints ck_student_ssex check(ssex='男' or ssex='女')--检查约束
--constraints un_student_sqq unique(sqq)--唯一约束
)
--添加主键约束
alter table student add constraints pk_student_sno primary key(sno);
alter table student drop constraints pk_student_sno;
--添加非空约束
alter table student add constraints ck_student_sname check(sname is not null);
alter table student drop constraints ck_student_sname;
--添加检查约束
alter table student add constraints ck_student_sage check(sage<150 and sage>0)
alter table student drop constraints ck_student_sage;
--添加检查约束校验性别
alter table student add constraints ck_student_ssex check(ssex='男' or ssex='女')
alter table student drop constraints ck_student_ssex;
--添加唯一约束
alter table student add constraints un_student_sqq unique(sqq)
select * from student
drop table student
二维表创建约束学习问题:
--问题1:学号重复依然可以添加
insert into student values(1,'关晓彤',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
insert into student values(1,'关晓彤001',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
--问题2:竟然可以没有名字
insert into student values(2,'',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
--问题3:年龄竟然可以超过200岁
insert into student values(3,'关晓彤002',300,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
--问题4:性别竟然可以为任意字符
insert into student values(4,'关晓彤',18,'a','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
--问题5:qq号竟然可以重复
insert into student values(5,'关晓彤003',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
insert into student values(6,'关晓彤004',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
---问题解决:
--问题1:使用主键约束,主键特点:非空唯一
--使用:
--直接在创建表的字段后使用 primary key
--在创建表的语句的最后面使用 constraints pk_表名_字段名 primary key(字段名)
--在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
--删除主键 alter table student drop constraints 主键的约束名;
--问题2:使用非空约束
--使用:
--直接在创建表的字段后使用 not null 关键字
--在创建表的语句的最后面使用 constraints ck_表名_字段名 check(字段名 is not null)
--在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check(字段名 is not null);
--删除非空约束 alter table student drop constraints 非空约束名;
--问题3:使用检查约束
--直接在创建表的字段后使用 check(条件) 例如 sage number(3) check(sage<150 and sage>0),
--在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
--在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check(条件);
--删除检查约束 alter table student drop constraints 检查约束名;
--问题4:使用检查约束
--直接在创建表的字段后使用 check(条件)
--在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
--在创建表之后使用alter table 表名 add constraints ck_表名_字段名 check(条件);
--删除检查约束 alter table 表名 drop constraints 检查约束名;
--问题5:使用唯一约束
--直接在创建表的字段后使用 unique
--在创建表的语句后面使用 constraints un_表名_字段名 unique(字段名);
--在创建表后使用 alter table 表名 add constraints un_表名_字段名 unique(字段名);
--删除约束:alter table 表名 drop constraints 唯一约束名;
二维表创建 外键约束学习:
--创建学生表
create table student(
sno number(10) primary key,
sname varchar2(100) not null,
sage number(3) check(sage>0 and sage<150),
ssex char(4) check(ssex='男' or ssex='女'),
sfav varchar2(500),
sqq varchar2(30) unique,
cid number(10) --references clazz(cno)
--constraints fk_student_cid foreign key(cid) references clazz(cno)--外键
)
--添加外键
alter table student add constraints fk_student_cid foreign key(cid) references clazz(cno) on delete set null
alter table student drop constraints fk_student_cid
drop table student
--添加测试数据
insert into student values(1,'张三001',18,'男','唱歌','657889900',1);
insert into student values(2,'张三002',18,'男','唱歌','657889901',1);
insert into student values(3,'李四001',18,'男','唱歌','657889903',2);
insert into student values(4,'李四002',18,'男','唱歌','657889904',2);
--创建班级表
create table clazz(
cno number(10) primary key,
cname varchar2(100) not null,
cdesc varchar2(300)
)
--添加测试数据
insert into clazz values(1,'java高薪就业班','6666');
insert into clazz values(2,'python高薪就业班','33333');
--查询学生及其班级信息
select * from student s
inner join clazz c
on s.cno=c.cno
--问题:竟然可以在学生表中插入一个不存在班级
insert into student values(5,'李四003',18,'男','唱歌','657889905',3);
--使用外键:
--作用:当在子表中插入的数据在父表中不存在,则会自动报错。
--概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束。
--其中主动依赖的表称为子表,被依赖的表称为父表。外键加在子表中。
--使用:
--在子表中的字段后直接使用 references 父表名(字段) 例如: cid number(10) references clazz(cno)
--在创建表语句的最后面使用 constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
--在创建表后使用:alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
--删除外键:alter table 表名 drop constraints 外键约束名
--外键选取:
--一般选取父表的主键作为子表的外键。
--外键的缺点:
--无法直接删除父表数据,除非级联删除
--级联删除:在添加外键约束时,使用关键字 on delete cascade
--使用:当删除父表数据时,自动删除子表相关所有数据。
--缺点:无法保留子表历史数据。
--使用关键字 on delete set null
--删除父表数据时,将子表中的依赖字段的值设置为null。
--注意:子表依赖字段不能添加非空约束。
--删除班级1的信息
select * from student
delete from clazz where cno=1