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,‘‘)
insert into student values(123,‘李四‘,‘男‘,18,7890122,88.99,‘‘)
问题2:姓名可以为空。
insert into student values(456,‘柳岩‘,‘女‘,18,666999,99.66,‘‘)
insert into student (snum,sex,age,qq,sal,mail) values(789,‘女‘,18,888444,99.66,‘‘)
问题3:性别不但可以为空,还可以为其他不知道的字符
insert into student (snum,sna,age,qq,sal,mail) values(108,‘景甜‘,18,000999,99.66,‘‘)
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,‘景甜‘,‘a‘,18,000999,99.66,‘‘)
insert into student (snum,sna,sex,age,qq,sal,mail) values(102,‘景甜‘,‘女‘,18,000999,99.66,‘‘)
问题4:年龄可以超过200
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,‘唐嫣‘,‘女‘,23,78900,99.66,‘‘)
insert into student (snum,sna,sex,age,qq,sal,mail) values(103,‘唐嫣‘,‘女‘,230,78900,99.66,‘‘)
问题5:qq号一致
insert into student (snum,sna,sex,age,qq,sal,mail) values(104,‘关晓彤‘,‘女‘,19,111000,99.66,‘‘)
insert into student (snum,sna,sex,age,qq,sal,mail) values(105,‘袁华‘,‘男‘,22,111000,99.66,‘‘)
解决问题
三种方式
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(字段名) );
其中check(条件)可以像这样写:check(age>0 and age <100)明白吗
3.表已经创建好了,再去添加/修改/删除
alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
alter table 表名 drop constraints pk_表名_字段名
问题1:学号重复了,数据还可以插入成功
使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空
---(1)、在确定为主键的字段后添加 primary key关键字
---(2)、在创建表的后面使用:constraints pk_表名_字段名 primary key(字段名)
---(3)、在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
--删除主键:alter table 表名 drop constraints pk_表名_字段名
问题2:姓名可以为空。
使用非空约束
---(1)、创建表的时候在字段后面添加not null
---(2)、在创建表字段后使用 constraints ck_表名_字段名 check(字段名 is not null) 了解
---(3 )、在创建表后使用alter table 表名 modify 字段名 类型 not null;
---(4)、修改字段可以存储空值:alter table 表名 modify 字段名 类型 null;
问题3:性别不但可以为空,还可以为其他不知道的字符
使用检查约束
---(1)、创建表的时候在字段后使用 default 值 check(条件),但是会允许空值的出现,并且默认值只有在字段不声明的情况下生效
---(2)、在创建表所有字段后使用:constraints ck_表名_字段名 check(条件)
---(3)、在创建表后使用:alter table 表名 add constraints ck_表名_字段名 check(条件)
问题4:年龄可以超过200
--使用检查约束条件
问题5:qq号一致
使用唯一约束
--(1)、在字段后直接使用unique关键字
--(2)、在所有字段后使用:constraints uk_表名_字段名 unique(字段名)
--(3)、 alter table 表名 add constraints uk_表名_字段名 unique(字段名)
--删除唯一约束:alter table 表名 drop constraints uk_表名_字段名