18 SQL语言——约束
理解约束
发现问题
现在我们创建一个Student表
create table student( snume number(10), sname varchar2(100), sex char(4), age number, qq number, sal number(6,2), mail varchar2(50) );
创建完成后,面临以下问题:
问题1:学号重复了,数据还可以插入成功
insert into student(snum,sna,sex,age,qq,sal,mail)values('123','张三','男',18,12345678,88.88,'12345678@qq.com')
insert into student values(123,'李四','男',18,7890122,88.99,'7890122@qq.com')
问题2:姓名可以为空。
insert into student values(456,'柳岩','女',18,666999,99.66,'666999@qq.com')
insert into student (snum,sex,age,qq,sal,mail) values(789,'女',18,888444,99.66,'888444@qq.com')
问题3:性别不但可以为空,还可以为其他不知道的字符
insert into student (snum,sna,age,qq,sal,mail) values(108,'景甜',18,000999,99.66,'000999@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,'景甜','a',18,000999,99.66,'000999@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,'景甜','女',18,000999,99.66,'000999@qq.com')
问题4:年龄可以超过200
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,'唐嫣','女',23,78900,99.66,'78900@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,'唐嫣','女',230,78900,99.66,'78900@qq.com')
问题5:qq号一致
insert into student (snum,sna,sex,age,qq,sal,mail) values(104,'关晓彤','女',19,111000,99.66,'111000@qq.com')
insert into student (snum,sna,sex,age,qq,sal,mail) values(105,'袁华','男',22,111000,99.66,'111000@qq.com')
解决问题
三种方式
1.在创建表的时候,写在字段后面
create table student( sname varchar2(10) not null primary key , )
2.创建表时,统一写在最后面
create table student1( snum number(10) not null primary key, sname varchar2(100), sex char(4), age number(10), qq number(30), sal number(6,2), mail varchar2(50) constraints pk_表名_字段名 primary key(字段名), constraints ck_表名_字段名 check(字段名 is not null), constraints uk_表名_字段名 unique(字段名), constraints fk_表名_字段名 foreign key(字段名) references 表2(字段) [on delete cascade|set null] )
其中check(条件)可以像这样写:check(age>0 and age <100)明白吗
3.表已经创建好了,再去添加/修改/删除约束
下面的pk/ck/uk/fk_表名_字段名 是规范的约束名。
添加:alter table 表名 add constraints pk/ck/uk/fk_表名_字段名 primary key/(字段名)/check(条件)/unique(字段名)/foreign key(字段名) references 表2(字段) [on delete cascad|set null];
删除:alter table 表名 drop constraints pk/ck/uk/fk_表名_字段名
添加默认值:alter table 表名 modify 字段名 defalut 值
修改字段类型:alter table 表名 modify 字段名 类型
删除约束
删除:alter table 表名 drop constraints 约束名
生成约束时,如果没有给约束取名,则系统自动生成约束名,我们先查询约束名,再使用上面的方法删掉即可。
查询约束: select * from user_cons_columns order by table_name;
找到对应的表对应的字段对应的约束名(constraint_name),删除即可。