字段约束

MySQL的字段约束共四种:

约束名 关键字 描述
主键约束 PRIMARY KEY 字段值唯一,且不能为NULL
非空约束 NOT NULL 字段值不能为NULL
唯一约束 UNIQUE 字段值唯一,但可以为NULL
外键约束 FOREIGN KEY 保持关联数据的逻辑性

关于主键约束

  • 主键约束字段要求字段值的唯一性,且不能为NULL
  • 建议使用数字类型的主键,提高检索速度,一般设置自增主键或GUID
CREATE TABLE t_emp(
id INT PRIMARY KEY AUTO_INCREMENT,
...
);

关于非空约束

  • 插入数据时,该字段值不能为NULL
  • NULL不是空字符串
  • 可以使用NOT NULL,但设置默认值
CREATE TABLE t_emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
married BOOLEAN NOT NULL DEFAULT FALSE
);

关于外键约束

外键约束主要用于保证数据的逻辑关系

t_dept:

dep_id dep_name tel
11 研发部 111
12 测试部 112
13 销售部 113

t_emp:

emp_num name sex dep_id
1 张三 11
2 李四 12

外键约束写在子表中:

-- 父表:
CREATE TABLE t_dept(
dep_id INT USIGNED PRIMARY KEY,
dep_name VARCHAR(20) NOT NULL UNIQUE,
tel CHAR(3) UNIQUE
); -- 子表:
CREATE TABLE t_emp(
emp_num INT USIGNED PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex CHAR(3) ENUM('男','女') NOT NULL,
dep_id INT USIGNED, FOREIGN KEY (dep_id) REFERENCES t_dept(dep_id)
);

设置外键约束后,若要删除父表内容,必须先删除子表相关的内容,这种约束能保证逻辑关系。

但另一方面,多表的相互外键关联,可能形成外键闭环,导致无法删除任何一张表的记录。故可以不设置外键约束,仅依靠应用程序的逻辑来保证。

索引机制

什么是数据库索引?

简单来说,索引是关系数据库中对某一列或多个列的值进行预排序的数据结构,一般数据库需要维护索引对应的二叉树。

为什么需要索引?

数据库如果有上万甚至上亿条记录,想要提高查询速度,就需要使用索引。

如何创建索引?

①、创建表的时候添加索引

CREATE TABLE table_name(
...,
INDEX [索引名] (字段名),
...
);

索引名是可选项,如果不定义索引名,则使用字段名作为索引名。

②、在已创建的表中添加索引

# 语法一:
CREATE INDEX 索引名 ON 表名(字段); # 语法二:
ALTER TABLE 表名 ADD INDEX [索引名](字段名)
# 查询索引
SHOW INDEX FROM 表名; # 删除索引
DROP INDEX 索引名 ON 表名;

创建索引要遵循什么原则?

  • 哪些表需要加索引?:数据量大,且经常被查询的数据表

  • 哪些字段要加索引?:经常作为检索条件的字段

  • 哪些字段不要加索引?:大字段类型(如长度超过50的字符串)

MySQL:字段约束与索引的更多相关文章

  1. 2-16 MySQL字段约束-索引-外键

    一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...

  2. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  3. mysql字段约束

    为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目. 一. unique 唯一性约束    : 值不可重复: 二. not null    非空约束    : 值不可为空: 三. def ...

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

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

  5. MySQL (三)-- 字段属性、索引、关系、范式、逆规范化

    1 字段属性 主键.唯一键和自增长. 1.1 主键 主键:primary key,一张表中只能有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能重复. 一张表只能有最多一个主键. 1.1 ...

  6. mysql约束与索引的区别

    一:约束 作用:是为了保证数据的完整性而实现的一套机制,它具体的根据各个不同的数据库的实现而有不同的工具(约束): 这里主要讲解mysql的约束: 1.非空约束:not null; 指示某列不能存储 ...

  7. MSSQL 如何删除字段的所有约束和索引

    原文MSSQL 如何删除字段的所有约束和索引 代码如下: ---------------------------------------------------------- --  mp_DropC ...

  8. .Net程序员学用Oracle系列(6):表、字段、注释、约束、索引

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.表 1.1.创建表 1.2.修改表 & 删除表 2.字段 2.1.添加字段 2.2.修改字段 & 删除字段 ...

  9. (转)Mysql哪些字段适合建立索引

    工作中处理数据时,发现某个表的数据达近亿条,所以要为表建索引提高查询性能,以下两篇文章总结的很好,记录一下,以备后用. 数据库建立索引常用的规则如下: 1.表的主键.外键必须有索引: 2.数据量超过3 ...

随机推荐

  1. D - D (畅通工程再续)

    相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政 ...

  2. [AHOI2009] [BZOJ1799] 月之迷 (数位DP)

    给出两个数a,ba,b,求出\([a,b]\)中各位数字之和能整除原数的数的个数. 我们按照模板的做法来想,枚举到第pos位时,要确定这一位的数字,可以更新现在所填数字的和,但对于最终的和无从得知,是 ...

  3. hoj2430 Counting the algorithms

    My Tags   (Edit)   Source : mostleg   Time limit : 1 sec   Memory limit : 64 M Submitted : 725, Acce ...

  4. zoj3623 Battle Ships

    Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense ...

  5. word2vector代码实践

    引子 在上次的 <word2vector论文笔记>中大致介绍了两种词向量训练方法的原理及优劣,这篇咱们以skip-gram算法为例来代码实践一把. 当前教程参考:A Word2Vec Ke ...

  6. 抓包 127.0.0.1 (loopback) 使用 tcpdump+wireshark

    直接使用 wireshark无法抓取 127.0.0.1环回的数据包,一种解决方法是先传到路由器再返回,但这样可能造成拥塞. Linux 先使用tcpdump抓包并输出为二进制文件,然后wiresha ...

  7. Keras模型拼装

    在训练较大网络时, 往往想加载预训练的模型, 但若想在网络结构上做些添补, 可能出现问题一二... 一下是添补的几种情形, 此处以单输出回归任务为例: # 添在末尾: base_model = Inc ...

  8. Flow All In One

    Flow All In One Flow is a static type checker for JavaScript https://github.com/facebook/flow https: ...

  9. Nmap & ncat

    Nmap & ncat https://github.com/udacity/course-ud303 https://nmap.org/dist/nmap-7.30-setup.exe Yo ...

  10. How to get a DOM element's ::before content with JavaScript?

    How to get a DOM element's ::before content with JavaScript? https://stackoverflow.com/questions/443 ...