Sql 六种约束

--1.主键约束问题

 

create table 学生表(
 学号 int primary key,
 姓名 varchar(10)
);

insert into 学生表 values(null,'a');
问题(无法执行)
原因(主键不能为空)

insert into 学生表 values(1,'a');
insert into 学生表 values(1,'b');
问题(无法执行)
原因(主键不能重复)

insert into 学生表 values(1,'a');
insert into 学生表 values(2,'b');
能执行

select * from 学生表;

 

--2.非空约束问题

 

create table 学生表(
 学号 int primary key,
 姓名 varchar(10) not null
);


insert into 学生表 values(1,null);
insert into 学生表(学号) values(1);
问题(不能将null插入姓名)
因为(列“姓名”有not null约束)

select * from 学生表;

 

--3.检查约束问题

 

drop table 学生表;

create table 学生表(
 学号 int primary key,
 姓名 varchar(10),
 年龄 int check(年龄<18)
);

insert into 学生表 values(1,'a',20);
问题(与"check"约束冲突)
原因(年龄字段的值必须<18)

insert into 学生表 values(1,'b',null);
能执行,原因是有检查约束的列可以接受null值,null不能与任何值比较

insert into 学生表(学号,姓名) values(3,null);
能执行,原因是没有指定约束,则默认可以为空


select * from 学生表;

 

--4.唯一约束问题


drop table 学生表;

create table 学生表(
 学号 int primary key,
 姓名 varchar(10),
 身份证 char(18) unique
);

insert into 学生表 values(1,'a',null);
insert into 学生表 values(2,'b',null);
问题(违反了“unique”约束)
原因(在SQL Sever中,唯一列不能有两个null值)
注:在其他数据库中,唯一是可以有多个null值


select * from 学生表;

 

--5.默认约束问题

 

drop table 学生表;

create table 学生表(
 学号 int primary key,
 姓名 varchar(10),
 性别 char(2) default '女'
);

insert into 学生表(学号,姓名) values(1,'a');


select * from 学生表;

 

--6.外键约束问题


create database 班级表(
 班级编号 int primary key,
 班级名称 varchar(10)
);


drop table 学生表;

create table 学生表(
 学号 int primary key,
 姓名 varchar(10),
 班级编号 int,foreign key (班级编号) references 班级表(班级编号)
);


insert into 学生表 value(1,'a',1);

insert into 班级表 values(1,'一班');
insert into 班级表 values(2,'二班');

insert into 学生表 values(3,'a',null);
问题(没有问题)
原因(当外键为null时,是无法与班级编号进行比较的;
      从业务上讲,此学生目前不在任何班)


insert into 学生表 values(4,'b',3);
问题(与约束“fk”有冲突)
原因(3号班级在班级表中不存在无法引用)

delete from 班级表 where  班级编号=1;
问题(与约束“fk”冲突)
原因(1号班级被引用,不能被删除)


select * from 学生表;
select * from 班级表;

 


--外键小结
 .不能在子表插入一个父表不存在的编号,但可以为空
 .不能删除父表中被引用的编号
 .(不能将子表中的外键更新为一个父表不存在的编号)
 .外键的本质就是:不能引用一个不存在的对象,
  不能删除一个被引用的对象

 

====本文来自新浪张婷博客

 

转载于:https://www.cnblogs.com/iStu/p/8594260.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值