数据库的基本操作--添加修改约束以及表结构的修改序列
1.约束
表的约束
往表中插⼊数据的时候,可能出现⼀些问题,⽐如:重复插⼊数据,内容不对(性别)
-------如何保证数据库表中数据的完整性和⼀致性呢?约束
常见的约束:
主键(primary key),外键(foreign key),唯⼀(unique),⾮空(not null),默认(default),⽤户⾃定义(check)
2. 约束分类
-----常见的约束有:
主键约束(primary key),
外键约束(foreign),
大会心得体会
唯⼀(unique),⾮空(not null)
默认(default)
⽤户⾃定义约束(check)
2.1 primary key 主键约束
什么是主键约束? 主键约束就是给表定义⼀个主键,什么是主键??
主键只要是⽤来保证表记录的唯⼀⾮空的。
主键(PRIMARY KEY )约束:唯⼀的标识表中的每⼀⾏,不能重复,不能为空。 创建主键或唯⼀约束后,ORACLE 会⾃动创建⼀个与约束同名的索引(UNIQUENES 为UNIQUE 唯⼀索引)。需要注意的是:每个表只能有且有⼀个主键约束。
什么是主键约束?主键约束就是给表定义⼀个主键,什么是主键?
--主键主要是⽤来保证表记录的唯⼀⾮空的。
建表的时候添加主键
create table student(stuno number(4)primary key,stuname varchar2(10),age number(2),addr varchar(50));
inrt into student values(1001,'zhang',18,'luoyang');
再次插⼊相同记录,违法主键约束,不允许插⼊
SQL>inrt into student values(1001,'zhang',18,'luoyang');
inrt into student values(1001,'zhang',18,'luoyang')
ORA-00001: 违反唯⼀约束条件(SYS.SYS_C0010797)
如果主键为null也不允许插⼊,同样是违反了主键约束
SQL>inrt into student values(null,'zhang',18,'luoyang');
inrt into student values(null,'zhang',18,'luoyang')
创建⼀张课程表:
create table cour(cno number(4)primary key,cname varchar2(20),cscore number(2));
–创建⼀张成绩表:学号和课程号共同作为⼀个主键,称为联合主键
⼀张表只能有⼀个主键
create table score(sno number(4),cno number(4),score number(5,2),constraint pk_score primary key(sno,cno));
drop table cour;
create table cour(cno number(4)constraint pk_cour primary key,cname varchar2(20),cscore number(2));
特别说明:不推荐⼤家使⽤复合主键。
2.2 unique 唯⼀
唯⼀(UNIQUE )约束:在表中每⼀⾏中所定义的这列或这些列的值都不能相同。必须保证唯⼀性。否则就会违法约束条件。⽤于指定列的值不能重复,可以为 null
举例:
create table ur2(id number unique,name varchar2(30));
inrt into ur2 values(1,111);//id 输⼊重复的值是会报错
注意:oracle 中中unique可以为null,⽽且允许多⾏为 nul
唯⼀约束:
–问题:student(sno,sname,age,addr,idcard)主键:sno,idcard(⾝份证号):可以为空,但是如果写的话要求唯⼀
–创建唯⼀约束:
1. (1)创建唯⼀约束⽅法⼀
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
age number(3),
addr varchar2(50),
idcard number(18)unique);
2. 2)创建唯⼀约束⽅法⼆
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
age number(3),
addr varchar2(50),
idcard number(18)constraint uk_idcard unique);
3. (3)创建唯⼀约束⽅法三
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
age number(3),
addr varchar2(50),
idcard number(18),constraint uk_idcard unique(idcard));
2.3 not null ⾮空
⾮空(NOT NULL )约束:顾名思义,所约束的列不能为 NULL 值。否则就会报错
小组评价举例:
create table ur1(id number,name varchar2(30)not null);
inrt into ur1 values(001,'');//会报错
–⾮空约束和默认约束
create table student(
sno number(4)primary key,--主键约束
sname varchar2(20)not null,--⾮空约束
age number(3)default18,--默认约束
addr varchar2(50),
idcard number(18)unique);--唯⼀约束
2.4 foreign key 外键约束 references
外键(FOREIGN KEY )约束:⽤来维护从表(Child Table)和主表(Parent Table)之间的引⽤完整性.能够维护数据库的数据⼀致性,数据的完整性。防⽌错误的垃圾数据⼊库; ⽤于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必需具有主键约束或是 e unique 约束,当定义外键约束后,要求外键列数据必需在
主表的主键列存在或是为 null
外键约束 外键 在另外⼀张表中是主键
student(sno sname,age,addr.udcard) 主键sno
cour (cno,cname ccou)主键sno
score (sno cno score)主键(sno ,cno) 外键:⼀个是sno ⼀个是cno
--------外键是做什么⽤的?如果student中没有学号1001学⽣信息,那么score中也不应该有该学⽣成绩
在score插⼊数据的时候,如果学⽣student中不存在对应学号或者课程表中不存在对应课程 则不允许插⼊
脸上长痘痘的原因
create table class(id number primary key,name varchar2(32));
create table stus(id number primary key,
name varchar2(36)not null,
classid number references class(id)
);
特别说明:froeign key外键的细节
1、外键指向主键列;
2、外键可以指向unique列;
3、建表时先建主表,再建从表;删除表先删从表,再删主表。
4、外键列属性值要与主键或unique列属性值的类型保持⼀致
5、外键列的值,必需在主键列中存在。但外键列的值允许为null
**外键约束:
外键:在另外⼀张表中是主键**
–student(sno,sname,age,addr,idcard) 主键:sno
–cour(cno,cname,cscore) 主键:cno
–score(sno,cno,score)主键: (sno,cno) 外键:sno 外键: cno
外键做什么⽤?如果student表中没有1001学⽣信息,那么score表中也不应该有该学⽣的成绩。
入党容易吗往成绩表插⼊数据的时候,如果学⽣表中不存在对应的学号,或者课程表中不存在对应的课程,则不允许插⼊
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
age number(3),
addr varchar2(50),
idcard number(18));
create table cour(
cno number(4)primary key,
cname varchar2(20),
cscore number(2));
1.创建外键约束的第⼀种⽅式
create table score(
stuno number(4)references student(sno),--创建第⼀个外键约束
couno number(4)references cour(cno),--创建第⼆个外键约束
score number(5,2),
constraint pk_score primary key(stuno,couno));--创建⼀个主键约束
2.创建外键约束的第⼆种⽅式
create table score(
stuno number(4)constraint fk_stuno references student(sno),--创建第⼀个外键约束
couno number(4)constraint fk_couno references cour(cno),--创建第⼆个外键约束
score number(5,2),
constraint pk_score primary key(stuno,couno));
3.创建外键约束的第三种⽅式
create table score(stuno number(4),
couno number(4),
score number(5,2),
constraint fk_stuno foreign key(stuno)references student(sno),
constraint fk_couno foreign key(couno)references cour(cno),
constraint pk_score primary key(stuno,couno));
外键约束总结
–总结1:在⼀张表中只能有⼀个主键,但是可以有多个外键。
–总结2:作为外键的字段名,不⼀定必须和被参考表⼀致。
–总结3:定义了外键约束之后,往表中插⼊⼀条记录,外键值会参考其⽗表中主键的值,只有⽗表中存在该值才能插⼊成功
–往student表中插⼊3条记录组装电脑
inrt into student values(1001,'zhangsan',19,'henanluoyang',98765432123456789);
inrt into student values(1002,'lisi',19,'henanluoyang',98765432123456789);
inrt into student values(1003,'wangwu',19,'henanluoyang',98765432123456789);
查看student表中所有内容
lect*from student;
查看cour表中所有记录
lect*from cour;
检疫证–思考:inrt into score values(1003,9997,89);能成功吗?不能,因为cour表中不存在课程号为9997的课程
–思考:inrt into score values(1003,9998,89);能成功吗?可以,因为1003在student表中存在,9998在cour表中存在–总结4:定义外键约束之后,删除⽗表中的记录,需要先将相关⼦表的记录删除
delete from student where sno=1003;--删除不掉,提⽰:违反完整约束条件 (SYS.SYS_C0010808) - 已找到⼦记录
--正确的做法:
delete from score where stuno=1003;--先删⼦记录
delete from student where sno=1003;--后删⽗记录
2.5 check 检查,⽤户⾃定义约束
条件(CHECK )约束:表中每⾏都要满⾜该约束条件。条件约束既可以在表⼀级定义
也可以在列⼀级定义。在⼀列上可以定义任意多个条件约束
猴币
举例:
create table ur4(id number primary key,
sal number check(sal>=1000and sal<=2000),
如何设置屏保密码x char(2)check(x in('男','⼥')));
inrt into ur4 values(1,1000,' 男');//sal 列的值不满⾜ 1000 ⾄⾄ 2000
⽤户⾃定义约束(检查约束)
check(约束条件)
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
age number(3)default18check(age between10and45),---定义学⽣年龄默认为18,⾃定义约束条件为在10到45岁之间
addr varchar2(50),
idcard number(18)unique);------⾝份证号唯⼀性约束条件
定义学⽣性别必须为男或者⼥
create table student(
sno number(4)primary key,
sname varchar2(20)not null,
gender char(2)check(gender in('男','⼥')),-------定义学⽣性别必须为男或者⼥
age number(3)default18check(age between10and45),
addr varchar2(50),
idcard number(18)unique);
总结:定义了完整性约束之后,表中记录的插⼊,删除,修改必须符合表的完整性约束条件,如果违反了完整性约束条件,则不允许操作
⼆、Oracle修改表结构
修改表结构
–问题:给student表添加字段regdate类型是date;
alter table student add regdate date;
alter table student add province varchar2(350);
删除刚才添加的字段
alter table student drop column regdate;
alter table student drop(province,regdate);
–修改字段类型和长度
alter table student modify idcard char(18);
alter table student modify idcard char(20);
修改表名
alter table student rename to stu;
修改字段名
alter table stu rename column gender to x;
4.给表添加约束
知识点4:如果建表的时候,没有添加约束,那么建好表之后,如何给表添加约束?
drop table stu cascade constraints;
create table student(
sno number(4),
sname varchar2(20),
gender char(2),
age number(3),
addr varchar2(50),
idcard number(18));
–添加主键约束
alter table student add constraint pk_sno primary key(sno);
–添加唯⼀约束
alter table student add constraint uk_idcard unique(idcard);
–添加检查约束