文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL约束

2017-07-27 01:23

关注

MySQL约束

约束(constraint)概述

为什么要约束

为了保证数据完整性

什么是约束

对表中字段的(强制)限制

约束的分类

单类约束,多列约束

列级约束:将此约束声明在字段的后面

表级约束:在表中所有字段声明完,在所有字段的后面声明的约束

not null (非空约束)

unique (唯一性约束)

primary key (主键约束)

foreign key (外键约束)

check (检查约束)

default (默认值约束)

如何添加约束

CREATE TABLE 添加约束
ALTER TABLE 增加、删除约束

如何查看表中约束

select * from information_schema.table_constraints
where table_name ="表的名字";

NOT NULL (非空约束)

限定某个字段 / 某列的值不能为空

特点

添加非空约束

CREATE TABLE 添加约束

CREATE TABLE emp2(           #建议大写
id int not null,
name varchar(15) not null,
email varchar(25),
salary decimal(10,2)
);
desc emp2;

#正确
insert into emp2(id,name,email,salary)
values(1,"Tom","tom@1126.com",3400);
#错误
insert into emp2(id,name,email,salary)
values(null,"Tom","tom@1126.com",3400);
insert into emp2(id,name,email,salary)
values(1,null,"tom@1126.com",3400);

ALTER TABLE 增加约束

#增加
alter table emp2
modify email varchar(25) not null;

删除非空约束

#删除
alter table emp2
modify email varchar(25) null;

:若在之前已经让要修改的字段中有null,则要先将null去除

UNIQUE (唯一性约束)

用来限制某个字段 / 某列的值不能重复

特点

添加唯一约束

单列

CREATE TABLE 添加约束

CREATE TABLE emp3(
id int unique,
name varchar(15),
email varchar(25),
salary decimal(10,2),
#表级约束
constraint uk_emp3_email unique (email)
           #约束名的名字
);
desc emp3;

#正确
insert into emp3(id,name,email,salary)
values(1,"Tom","tom@126.com",4500);
insert into emp3(id,name,email,salary)
values(2,"Tom1",null,4700);
insert into emp3(id,name,email,salary)
values(3,"Tom2",null,4600);
#错误
insert into emp3(id,name,email,salary)
values(1,"Tom3","to1@126.com",4500); #id重复

ALTER TABLE 增加约束

#添加
方式一:
alter table emp3
add constraint uk_emp3_sal unique (salary);#和表级约束差一样
                #约束的名字
方式二:
alter table emp3
modify name varchar(15) unique;#和列级约束一样

多列(复合型唯一性约束)

约束后的字段中的数据,不能都是一样,只要有一点不同,就可以执行

CREATE TABLE USER(
id int ,
name varchar(15),
·password· varchar(25),
#表级约束
constraint uk_USER_name_pwd unique (name,`password`)
           #约束名的名字      
);
#正确
insert into USER
values (1,"Tom","abc");
insert into USER
values (1,"Tom","abcd");
#错误
insert into USER
values (1,"Tom","abc"); #

删除唯一性约束

#删除
alter table emp3
drop index 索引名;

PRIMARY KEY(主键约束)

用来唯一标识表中的一行记录(区分不同的行)

特点

添加主键约束

单列

CREATE TABLE 添加约束

CREATE TABLE emp4(
id int primary key,#列级约束
name varchar(15),
email varchar(25),
salary decimal(10,2)
);

CREATE TABLE emp5(
id int,
name varchar(15),
email varchar(25),
salary decimal(10,2),
constraint pk_emp5_id primary key (id)#表级约束,但是没有必要起名字
);

#正确
insert into emp4(id,name,email,salary)
values(1,"Tom","tom@1126.com",3400);
#错误
insert into emp4(id,name,email,salary)
values(1,"Tom","tom@1126.com",3400); #id重复
insert into emp4(id,name,email,salary)
values(null,"Tom","tom@1126.com",3400); #出现null值

ALTER TABLE 增加约束

ALTER TABLE emp6
add primary key (id);

多列

CREATE TABLE USER1(
id int ,
name varchar(15),
·password· varchar(25),
primary key (name,`password`)
);

删除主键约束(实际开发中不会删除)

alter table emp6
drop primary key;

自增列:AUTO_INCREMENT

让某个字段的值自增

特点和要求

:在实际开发中如果主键作用的字段有auto_increment,则在添加数据是不需要对该字段去赋值

添加自增长列

CREATE TABLE 添加约束

CREATE TABLE emp7(
id int primary key auto_increment ,
name varchar(15)
);

insert into emp7(name)
values("Tom"); #执行一次,id+1不需要赋值

ALTER TABLE 增加约束(一般不会使用)

alter table emp8 #id已经是主键
modify id int auto_increment;

删除自增列

alter table emp8
modify id int;

MySQL8.0新特性——自增量的持久性

若删除一行记录,重启服务器,再执行添加语句,则该自增列的值=刚才删除的行的自增列的数+1

FOREIGN KEY(外键约束)

限定某个表的某个字段的引用完整性

不可以跨存储引擎

主表和从表 / 父表和子表

eg:学生表和课程表是主表,选课表是从表

特点:

添加外键约束

CREATE TABLE 添加约束

#先创建主表
CREATE TABLE dept1(
dept_id int primary key,#必须给要关联的列添加主键或是唯一约束
dept_name varchar(15)
);
#创建从表
CREATE TABLE emp01(
emp01_id int primary key auto_increment,
emp01_name varchar(15),
department_id int,
#表级约束
constraint fk_emp01_id foreign key(department_id) references dept1(dept_id)
);

#演示外键效果
insert into dept1
values (10,"IT");#先创建主表的数据10号部门

INSERT INTO emp01
values (1001,"Tom",10);
#若是删除或是更改当前主表中的10号部门,是不可行的

ALTER TABLE 增加约束

#主表
CREATE TABLE dept2(
dept_id int primary key,
dept_name varchar(15)
);
#从表
CREATE TABLE emp02(
emp01_id int primary key auto_increment,
emp01_name varchar(15),
department_id int,
);

alter table emp02
add constraint fk_emp02_deot_id foreign key (department_id) references dept2(dept_id);

约束等级

最好采用ON UPDATE CASADE ON DELETE RESTRICT 的方式,声明位置在约束条件的后面

删除约束

  1. 先查看约束名和删除外键约束
select * from information_schema.table_constraints
where table_name ="表的名字";

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

  1. 查看索引名,并删除(只能手动)
show index from 表名;

alter table 从表名
drop index 索引名;

开发场景

外键会让操作受到限制

不建议使用外键和级联,一切外键概念必须在应用层解决(经典白学)

CHECK (检查约束)

检查某个字段的值是否符合相应的要求,一般是指值的范围

MySQL5.7不支持CHECK约束

CREATE TABLE emp10(
id int,
name varchar(15),
salary decimal(10,2) check (salary > 2000)  
);

insert into emp10
values (1,"Tom",3000);#成功
insert into emp10
values (2,"Tom1",1500);#失败

DEFAULT(默认值约束)

给某个字段 / 某列指定一个默认值,一旦指定以后,在插入数据时,如果此字段没有显示赋值,则赋值为默认值

添加默认值约束

CREATE TABLE 添加约束

CREATE TABLE emp11(
id int,
name varchar(15),
salary decimal(10,2) default 2000
);

insert into emp11
values (1,"Tom",3000);#成功
insert into emp11(id,name)
values (2,"Tom1");#默认添加2000的工资

ALTER TABLE 增加约束

ALTER TABLE emp12
modify salary varchar(8,2) default 2500;

删除默认值约束

ALTER TABLE emp12
modify salary varchar(8,2);#直接去掉(NOT NULL差不多)

原文地址:https://www.cnblogs.com/wht-de-bk/archive/2022/03/14/16006222.html

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯