SQL中的约束

一、主键约束:PRIMARY KEY

1、特点:

(1)一个表有且只有一个主键约束
(2)主键约束 唯一并且非空
(3)主键约束的关键词为primary key
(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除

2、在建表的时候指定主键约束

create table 表名称(
       字段名1 数据类型 primary key,
       字段名2 数据类型,
       …
);
例如:
create table t_stu(
       sid int primary key,
       sname varchar(20),
       gender char
);
在这里插入图片描述
insert into t_stu values(1,‘张三’,‘男’),(1,‘李四’,‘女’);
在这里插入图片描述
insert into t_stu values(1,‘张三’,‘男’),(2,‘李四’,‘女’);

3、建表后如何指定主键约束

alter table 表名称 add primary key(字段列表);

create table t_stu(
       sid int,
       sname varchar(20),
       gender char
);

alter table t_stu add primary key(sid);

4、主键约束分为两种:

(1)单列主键约束
                单列如3
(2)复合主键约束

建表时如何指定复合主键约束:
create table 表名称(
       字段名1 数据类型,
       字段名2 数据类型,
       …,
       primary key(字段列表)
);
建表后如何指定复合主键约束:
alter table 表名称 add primary key (字段列表);

建立课程表,
create table t_course(
       cid int primary key,
       cname varchar(20)
)
现在要求创建一个选课表,表中sid和cid的组合是主键,是唯一的
create table xuanke(
       sid int,
       cid int,
       score int,
       primary key(sid,cid)
);

5、删除主键约束

alter table 表名称 drop primary key;

二、唯一约束:UNIQUE KEY

1、特点

(1)一个表可以有多个唯一键约束
(2)唯一键约束可以为NULL
(3)唯一键约束名可以自己指定,也可以默认。如果单列唯一,默认就是列名,如果是多列组合唯一,那么默认是该组合第1列的名称。
(4)创建唯一键约束,也会在对应列上创建索引。而且删除唯一键约束的方式是通过删除对应索引来实现的。

2、建表时如何指定唯一键

(1)单列的唯一键
create table 表名称(
       字段名1 数据类型 primary key,
       字段名2 数据类型 unique key,
       …
);
(2)多列组合的唯一键
create table 表名称(
       字段名1 数据类型 primary key,
       字段名2 数据类型 ,
       …,
       unique key(字段列) --既适用于单列,也适用于多列
);

create table books(
       bid int primary key,
       bname varchar(20) unique key,
       price double
);

唯一键作用示例:
insert into books values
(1,’《Java从入门到放弃》’,100),
(2,’《Java从入门到放弃》’,80);
运行结果
bname不相同时才可插入数据。

4、建表后指定唯一键约束

alter table 表名称 add unique key(字段列表);

5、删除唯一键约束

alter table 表名称 drop index 索引名;

6、查看某个表的索引

show index from 表名称;

三、非空约束:NOT NULL

1、特点

(1)一个表可以有很多的非空约束
(2)非空约束只能针对某一个字段来说
(3)非空约束意味着该字段不能为null值

2、建表时指定非空约束

create table 表名称(
       字段名1 数据类型 primary key,
       字段名2 数据类型 【unique key】 not null,
       字段名2 数据类型 not null,
       …
);

3、建表后指定字段非空

alter table 表名称 modify 字段名 数据类型 not null;

4、删除非空约束

alter table 表名称 modify 字段名 数据类型;

四、默认值约束:DEFAULT

1、特点

(1)一个表可以有很多的非空约束
(2)非空约束只能针对某一个字段来说
(3)非空约束意味着该字段如果没有手动赋值,则会按照默认值赋值

2、建表时指定默认值约束

create table 表名称(
       字段名1 数据类型 primary key,
       字段名2 数据类型 【unique key】 【not null】 default 默认值,
       字段名2 数据类型 default 默认值,
       …
);
数据插入时:
insert into t_stu values(1,‘张三’,default);
insert into t_stu(sid,sname) values(1,‘张三’);

3、建表后指定某个字段有默认值约束

alter table 表名称 modify 字段名 数据类型 default 默认值;
提醒:
create table t_stu(
       sid int primary key,
       sname varchar(20) not null,
       gender char not null
);
若增加默认值得字段本身为非空,再添加默认值时,需:
alter table t_stu modify gender char default ‘男’ not null;

4、取消默认值约束

alter table 表名称 modify 字段名 数据类型 【not null】;

五、检查约束:CHECK

mysql中暂不支持

1、语法

create table t_stu(
       sid int primary key,
       sname varchar(20),
       gender char check(‘男’ or ‘女’)
);
表示gender字段只能输入“男”或者“女”,其他值均不行。

六、自增约束

1、特点

(1)一个表只能有一个自增约束。因为一个表只有一个维护自增值的变量
(2)自增约束的列只能是整数列
(3)自助呢公约数的列必须是键列(主键、唯一键、外键),实际中一般是主键自增最多

2、建表时指定自增约束

create table 表名称(
       字段名1 数据类型 primary key auto_increment,
       字段名2 数据类型 【unique key】 【not null】 default 默认值,
       字段名2 数据类型 default 默认值,
       …
);

3、给自增列添加数据

自增列中,如果指定值,就按照指定的来,如果没有指定值就自增。
如果指定的值为0或null,就按照上一数据自增

insert into t_stu(sname) values(‘张三’); #sid = 1
insert into t_stu(sname) values(‘李四’); #sid = 2

insert into t_stu values(5,‘李四’); #sid = 5
insert into t_stu(sname) values(‘赵六’); #sid = 6
insert into t_stu values(0,‘钱七’); #sid = 7
insert into t_stu values(null,‘王八’); #sid = 8
insert into t_stu values(-1,‘负数’); #sid = -1
insert into t_stu(sname) values(‘哟哟哟’); #sid = 9
insert into t_stu values(3,‘没有的3’); #sid = 3
insert into t_stu(sname) values(‘切克闹’); #sid = 10

4、建表后增加自增约束

alter table 表名称 modify 字段名 数据类型 auto_increment;

5、取消自增约束

alter table 表名称 modify 字段名 数据类型;

七、外键约束

1、特点:

(1)一个表可以有很多个外键约束
(2)外键约束是需要一个表的两个字段或两个表的两个字段之间建立的
(3)外键约束一定是从表/字表中建立的
(4)在从表中外键约束的字段/列,与在主表中外键约束参考的字段/列,这两个列的名称可以不同
(5)外键约束是同时约束双方的行为的:
                对于主表来说:修改和删除受到了约束
                对于从表来说:修改和添加受到了约束
(6)主表被参考的字段/列必须是键列。意味着主表被约束字段为主键或者唯一键

建表时,先建主表,再建从表。
删除时,先建从表,再删主表。

举例:
    1)部门表和员工表
          员工表中有一个字段,表示该员工所在的部门
          部门表是主表
          员工表是从表,意味着员工进入的是哪个部门
          所以外键建立在员工表中

          部门表中表示部门编号,用did表示,数据类型int
          员工表中表示该员工所在部门,用编号时,可以选择同名(did)或者其他名字
    2)学生表、课程表、选课表
          主表:学生表和课程表
          从表:选课表,其中外键有两个,一个是参考学生表,一个是参看课程表

2、约束的等级

(1)Cascade方式:级联
          主动权在主表上。
          如果主表被依赖字段修改了,从表对应的外键字段跟着修改
          如果主表被依赖字段的记录被删除了,从表对应的外键字段的记录也会删除
(2)Set null 方式
          主动权在主表上。
          如果主表被依赖字段修改了,从表对应的外键字段设置为null
          如果主表被依赖字段的记录被删除了,从表对应的外键字段的设置为null
其中要求:外键字段必须不能有非空约束。
(3)No action方式:不作处理
(4)Restrict方式:
          (3)和(4)中,如果主表的被依赖字段的值被引用了,那么主表对该字段的修改和删除就被完全限制了。即不能修改和删除。
          若想处理,必须先处理从表对应的值,才能进行修改和删除。
(5)Set default方式:mysql的Innodb引擎不支持

3、建表时指定外键约束

create table 表名称(
       字段名1 数据类型 primary key auto_increment,
       字段名2 数据类型 【unique key】 【not null】 default 默认值,
       字段名2 数据类型 default 默认值,
       …,
       foreign key(从表的某字段) references 主表名(被参考字段) 【on update 等级】 【on delete 等级】
);
例如:
create database 11_db;
use 11_db;
#主表
create table dept(
       did int primary key,
       dname varchar(20)
);
#从表
create table emp(
       eid int primary key,
       ename varchar(20),
       did int,
       foreign key(did) references dept(did) on update cascade on delete set null
);

4、建表后指定外键约束

alter table 从表名称 add foreign key(从表的某字段) references 主表名(主表被引用字段) 【on update 等级】 【on delete 等级】;

5、删除外键约束

alter table 从表名称 drop foreign key 约束名;

6、查看某个表的外键约束名

select * from information_schema.table_constraints where table_name = ‘表名称’;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值