18 SQL语言——约束

xuanlvhaoshao 2020-02-13

理解约束 

跳转w3school约束解析

发现问题

现在我们创建一个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_表名_字段名

 

相关推荐