约束与索引

概念

1、数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。

  • 实体完整性(Entity Integrity):例如,同一个表中,不能存在两条完全相同无法区分的记录

  • 域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”

  • 引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门

  • 用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空等

2、约束

  • 键约束:主键约束、外键约束、唯一键约束

  • Not NULL约束:非空约束

  • Check约束:检查约束

  • Default约束:默认值约束

  • 自增约束

3、约束(CONSTRAINTS)与索引(INDEX)

约束是用来对数据业务规则和数据完整性进行实施、维护。约束的作用范围仅限在当前数据库,是逻辑约束,不会因为设置约束而额外占用空间。

索引是一个单独、物理的存储在数据页上的数据库结构,它是表中一列或若干列值的集合和相应的指向表中数据值的物理标识数据页的逻辑指针清单(类似于新华字典的目录索引页)。可以大大提高查询速度。应该在键列、或其他经常要查询、排序、按范围查找的列上建立索引。

Mysql会在主键、唯一键、外键列上自动创建索引,其他列需要建立索引的话,需要手动创建。

其中主键删除,对应的索引也会删除

删除唯一键的方式是通过删除对应的索引来实现的

删除外键,外键列上的索引还在,如果需要删除,需要单独删除索引

查看某个表的约束

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';

SHOW CREATE TABLE 表名;

查看某个表的索引

SHOW INDEX FROM 表名称;

主键约束:primary key

主键分为单列主键和复合主键

主键的特点

(1)唯一并且非空(2)一个表只能有一个主键约束(3)主键约束名就叫做PRIMARY(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除。

建表时指定主键约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  ....
);

create table 【数据名.】表名(
  字段名1 数据类型,
  ....,
  primary key(字段名1)
);

create table 【数据名.】表名(
  字段名1 数据类型,
  字段名2 数据类型,
  ....,
  primary key(复合主键字段列表)  #如果是复合主键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加primary key
);

建表后指定主键约束

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

删除主键约束

alter table 表名称 drop primary key;

唯一键约束:unique key

唯一键约束特点:

(1)同一个表可以有多个唯一约束。(2)唯一约束可以是某一个列的值唯一,也可以多个列组合值的唯一。(3)MySQL会给唯一约束的列上默认创建一个唯一索引。(4)删除唯一键只能通过删除对应索引的方式删除,删除时需要指定唯一键索引名

建表时指定唯一键约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 unique key,
  ....
); create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型,
  字段名3 数据类型,
  ....,
  unique key(复合唯一字段列表)  #如果是复合唯一键,那么就需要在所有字段列表后面使用这种形式指定,不能在字段后面直接加unique key
);

建表后增加唯一键约束

alter table 表名称 add 【constraint 约束名】 unique 【key】 (字段名列表);

#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。

删除唯一键约束

ALTER TABLE 表名称 DROP INDEX 唯一键约束名;

外键约束:foreign key

外键特点:

  • 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

  • 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。

  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外键的约束名。

  • 删除外键时,关于外键列上的普通索引需要单独删除。

要求

  • 在从表上建立外键,而且主表要先存在。

  • 一个表可以建立多个外键约束

  • 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键),推荐引用主表的主键。

  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样

约束关系:约束是针对双方的

添加了外键约束后,主表的修改和删除受约束

添加了外键约束后,从表的添加和修改受约束

5个约束等级

  • Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  • Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null

  • No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

  • Restrict方式:同no action, 都是立即检查外键约束

  • Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

如果没有指定等级,就相当于Restrict方式

建表时指定外键约束

create table 【数据名.】从表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 【unique key】,
  ....,
  【constraint 外键约束名】 foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级】
);

#外键只能在所有字段列表后面单独指定
#如果要自己命名外键约束名,建议 主表名_从表名_关联字段名_fk

建表后指定外键约束

alter table 从表名称 add 【constraint 外键约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】【on delete xx】;

删除外键约束

ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;

#删除外键约束不会删除对应的索引

删除索引

ALTER TABLE 表名称 DROP INDEX 索引名;

非空约束:not null

规定某个字段不能为空

建表时指定非空约束

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

建表后指定非空约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】;

#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

删除非空约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;

#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

默认值约束:default

建表时指定默认约束

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

建表后指定默认值约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】 【NOT NULL】;

#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失

删除默认值约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【NOT NULL】;

#如果该字段原来设置了非空约束,要跟着一起再写一遍,否则非空约束会丢失

检查约束,mysql暂不支持

自增约束:auto_increment

特点:

  • 一个表最多只能有一个自增长列

  • 自增长列必须是键列(主键列,唯一键列,外键列),并且要求非空。

  • 自增列必须是整数类型

  • InnoDB表的自动增长列可以手动插入,但是插入的值如果是空或者0,则实际插入的将是自动增长后的值。

建表时指定自增长

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

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

建表后指定自增长

alter table 【数据名.】表名 modify 自增字段名 数据类型 auto_increment;

删除自增约束

alter table 【数据名.】表名 modify 自增字段名 数据类型;

添加数据时,如果某列有自增约束,怎么添加该字段的值

insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应自增列可以赋值为null和0
insert into 【数据库名.]表名称(部分字段列表) values(值列表);#自增列在(部分字段列表)中不写就可以

添加数据时,如果某列有默认值约束,怎么添加、修改该字段的值

insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应默认值列,如果想用默认值,用default

insert into 【数据库名.]表名称(部分字段列表) values(值列表);#对应默认值列,如果想用默认值,在(部分字段列表)中不写就可以

修改数据

update 【数据库名.]表名称 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 条件】; #对应默认值列,如果想用默认值,写字段名 = default就可以

Mysql基础02-约束的更多相关文章

  1. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  2. mysql基础之约束

    约束的目的: 1.约束保证数据的完整性和一致性. 2.约束分为表级约束 和 列级 约束.(针对约束字段的数目的多少来确定的) 3.约束类型包括 not null (非空约束) primary key( ...

  3. MYSQL基础02(查询)

    查询是很大的一块,所以这里我只会写mysql的特点,就我目前使用的情况,MYSQL对标准SQL是比较支持,如果是新手的话,建议去w3school 学习标准SQL. 1.DUAL DUAL是一个虚拟表, ...

  4. 10. MySQL基础-02条件查询、排序查询

    2. 条件查询 语法 ​ select 查询列表 from 表名 where 筛选条件: 分类 按条件表达式筛选 简单的条件运算符:> < = != <> >= ⇐ 按逻 ...

  5. MySQL基础(三)——约束

    MySQL基础(三)--约束 约束是在表上强制执行的数据校验规则,主要用于维护表中数据的完整性以及当数据之间有以来关系时,保护相关的数据不会被删除. 根据约束对列的限制,可以划分为:单列约束(只约束一 ...

  6. 02 mysql 基础二 (进阶)

    mysql 基础二 阶段一 表约束 1.not null 非空约束 例子: create table tb1( id int, name varchar(20) not null ); 注意 空字符不 ...

  7. MySQL基础(6) | check约束

    MySQL基础(6) | check约束 前言 在一些情况下,我们需要字段在指定范围的输入, 例如:性别只能输入 '男'或者'女',余额只能大于0等条件, 我们除了在程序上控制以外,我们还能使用 CH ...

  8. 数据库02 /MySQL基础数据类型、完整性约束、sql_mode模式

    2.MySQL基础数据类型.完整性约束.sql_mode模式 目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 MySQL常用数据类型预览 1. 1 数 ...

  9. 服务管理之mysql基础

    目录 mysql基础 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 2. mysql安装与配置 2.1 mysql安装 2.2 mysql配置 3. mysql的程序组成 ...

  10. Linux服务-mysql基础篇

    目录 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 1.3 关系型数据库的常见组件 1.4 SQL语句 2. mysql安装与配置 2.1 mysql安装 2.2 mysq ...

随机推荐

  1. 深入理解计算机系统 第八章 异常控制流 part1

    本章主旨 第八章的目的是阐述清楚应用程序是如何与操作系统交互的(之前章节的学习是阐述应用程序是如何与硬件交互的) 异常控制流 异常控制流,即 ECF(exceptional contril flow) ...

  2. 网站搭建-windows 系统 本地 网站搭建 - IIS

    上一章有提到IIS安装,现在打开它: 点击浏览,如果没有启动的话,先点击启动. ip先选好,第一个吧,本机的(IIS自己提供了初始网页的东西). 然后可以自己去https://www.freemoba ...

  3. ASP.NET Core 1.0: Using Entity Framework Core

    伴随着ASP.NET Core 1.0发布的还有Entity Framework Core 1.0; 官方文档链接:https://docs.efproject.net/en/latest/platf ...

  4. Comet OJ - Contest #10 C题 鱼跃龙门

    ###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2  % x == 0 ,即 n * (n + 1)  % 2x == 0 . 分析: 1 ...

  5. nyoj 115-城市平乱 (BFS)

    115-城市平乱 内存限制:64MB 时间限制:1000ms 特判: No 通过数:5 提交数:8 难度:4 题目描述: 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维 ...

  6. Linux入门之安装及相关知识。

    一.VMware虚拟机安装与使用 1.1.VMware 简介 VMware是一个虚拟PC的软件,可以在现有的操 作系统上虚拟出一个新的硬件环境,相当于模拟 出一台新的PC.以此来实现在一台机器上真正 ...

  7. 【接口测试】HttpClient+fastJson 总结与案例

    多次理解,反复练习,破釜沉舟. HttpCLient是什么 Apache Jakarta Common 下的子项目 支持 HTTP 协议的客户端编程工具包 支持 HTTP 协议最新的版本 怎么利用Ht ...

  8. 0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。

    如果你是希望通过0MQ来做缓冲队列,非阻塞的效果,那你就必须清楚 0MQ Socket是会阻塞,你要搞清楚0MQ Socket与队列的关系. 官方协议文档规定了,一部分类型的 0MQ Socket为不 ...

  9. TreeMap的源码学习

    TreeMap的源码学习 一).TreeMap的特点 根据key值进行排序. 二).按key值排序的两种排序算法实现 1).在构造方法中传入比较器 public TreeMap(Comparator& ...

  10. python3基础之 字符串切片

    一.python3中,可迭代对象有:列表.元组.字典.字符串:常结合for循环使用:均可使用索引切片 实例: str = ' #str[start:stop:step] 遵循[左闭右开]规则 prin ...