zoukankan      html  css  js  c++  java
  • MySQL:字段约束与索引


    字段约束

    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的字符串)

  • 相关阅读:
    Android连载7-动语添加碎片
    JavaScript连载6-转化为Number和Boolean类型、运算符
    Java连载111-timer定时器、反射机制概述
    用conda创建虚拟环境的一些常用命令
    Java内存分析
    Java语言中的Class类
    线程协作
    LeetCode刷题笔记第26题
    LeetCode刷题笔记第20题(括号匹配)
    LeetCode刷提笔记第1332题
  • 原文地址:https://www.cnblogs.com/bqzzz/p/14404052.html
Copyright © 2011-2022 走看看