约束与索引

概念

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. Spring源码解析之@Configuration

    @Configuration简介 用于标识一个类为配置类,与xml配置效果类似 用法简介 public class TestApplication { public static void main( ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 3.1 资源命名

    之前讲了RESTful API的统一资源接口这个约束,里面提到了资源是通过URI来进行识别的,每个资源都有自己的URI.URI里还涉及到资源的名称,而针对资源的名称却没有一个标准来进行规范,但是业界还 ...

  3. PHP经典算法题

    1.百钱买百鸡 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 分析:估计现在小学生都能手工推 ...

  4. 深度剖析Javascript执行环境、作用域链

    一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都 ...

  5. location 优先级

    ###我只是个搬运工 规则 等号类型(=)的优先级最高.一旦匹配成功,则不再查找其他匹配项 前缀普通匹配(^~)优先级次之.不支持正则表达式.使用前缀匹配,如果有多个location匹配的话,则使用表 ...

  6. sqlalchemy 源码分析之create_engine引擎的创建

    引擎是sqlalchemy的核心,不管是 sql core 还是orm的使用都需要依赖引擎的创建,为此我们研究下,引擎是如何创建的. from sqlalchemy import create_eng ...

  7. GeoServer CQL查询时中文问题

    1.GeoServer可以进行CQL与ECQL过滤,wms和wfs都可以 2.CQL与ECQL查询时,当传中文时会报错.将中文转为Unicode编码后就可以 /* *js Unicode编码转换 */ ...

  8. JavaScript笔记八

    1.原型(prototype) - 创建一个函数以后,解析器都会默认在函数中添加一个数prototype prototype属性指向的是一个对象,这个对象我们称为原型对象. - 当函数作为构造函数使用 ...

  9. python遍历所有盘符下的图片并拷贝下来

    最近在学习python,闲着无聊就试着写啦这个小的脚本,虽然有很多不足,但是还是收获不少. 该脚本的功能: ①遍历本地计算机中的所有盘符,并将名称记录下来: ②循环遍历盘符下的所有图片(当然这里可以根 ...

  10. 查找节点(getAttribute())

    getAttribute():方法将返回一个给定元素的一个给定属性节点的值: attributeValue = element.getAttribute(attributeName); 给定属性的名字 ...