18 SQL语言——约束

理解约束 

跳转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,'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),删除即可。

 

原文地址:https://www.cnblogs.com/Scorpicat/p/12304437.html