美文网首页
day04 索引 约束 触发器

day04 索引 约束 触发器

作者: yuxiaohu | 来源:发表于2017-12-03 16:11 被阅读0次

    1 索引

    什么是索引

    1: 快速查询数据库表中的特定记录,由数据库表中一列或多列组合而成。
    2: 通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列。
    3: 对索引进行的I/O 操作比对表进行操作要少很多
    4: 索引一旦被创立将被 MySQL 系统自动维护,查询语句中不用指定使用哪个索引。
    5: 索引是一种提高查询效率的机制。
    6: 索引可以提高查询的速度,但是会影响插入记录的速度。
    

    索引的分类

    1:普通索引:
       可以创建在任何数据类型中,其值是否唯一和非空由字
    段本身的完整性约束条件决定。
    
    2:唯一性索引:
       使用 UNIQUE 参数可以设置索引为唯一性索引。创建唯
    一性索引的字段的值,必须是唯一的。主键就是一种特殊唯
    一性索引。
    
    3:全文索引:
       使用 FULLTEXT 参数可以设置索引为全文索引,全文索
    引只能创建在 CHAR、VARCHAR 或 TEXT 类型的字段上,且只
    有 MYISAM 存储引擎支持全文检索。
    
    4:单列索引:
       在表中的单个字段上创建索引。单列索引只根据该字段
    进行索引。 单列索引可以是普通索引, 也可以是唯一性索引,
    还可以是全文索引。只要保证该索引只对应一个字段即可。
    
    5:多列索引:
       多列索引是在表的多个字段上创建一个索引。该索引指
    身创建时对应的多个字段,可以通过这几个字段查询。但是
    查询条件中使用了第一个字段,索引才会被使用。
    
    6:空间索引:
       使用 SPATIAL 参数可以设置索引为空间索引。空间索引
    只能建立在空间数据类型上。MySQL 中的空间数据类型包括
    GEOMETRY 和 POINT、LINESTRING 和 POLYGON 等,目前只有
    MyISAM存储引擎支持空间检索,而且索引字段不能为空值。
    

    创建索引

    在创建表的时候创建索引
    
    CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件],
    属性名 数据类型 [完整性约束条件],
    ...
    属性名 数据类型
    [UNIQUE | FFULLTEXT | SPATIAL]
    INDEX | KEY [别名] (属性名 1 [(长度)] [ASC | DESC]) );
    
    1 :创建普通索引 
    CREATE TABLE index1 (
      id INT,
      NAME VARCHAR (20),
      sex CHAR(2),
      INDEX (id) //普通索引
    );
    
    2:查看表的结构
    SHOW CREATE TABLE index1;
    SHOW INDEX FROM book; //查看索引分布
    
    3:查看索引是否被使用
    EXPLAIN SELECT * FROM index1 WHERE id = 1;
    
    4:在已经存在的表上创建索引
    
    语法如下:
    CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名
    ON 表名 (属性名 [(长度)] [ASC | DESC]);
    
    例:
    CREATE INDEX book_index ON book(id);//在book表中id字段创建普通索引
    
    5: 通过修改表创建索引,索引可以只是字段内容的一部分
    
    语法如下:
    ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL | INDEX 索引名 
    (属性名 [(长度)] [ASC | DESC]);
    
    例:
    ALTER TABLE book ADD INDEX index13_name(NAME(5));
    

    删除索引

    一些不再使用的索引会降低表的更新速度,影响数据库性能,需要删除。
    例:
    DROP INDEX index13_name ON book;
    SHOW INDEX FROM book; //查看索引分布
    

    合理使用索引提升查询效率

    1: 为经常出现在WHERE 子句中的列创建索引
    2: 为经常出现在ORDER BY、DISTINCT 后面的字段建立索引。
       如果建立的是复合索引,索引的字段顺序要和这些关键
       字后面的字段顺序一致。
    3: 为经常作为表的连接条件的列上创建索引
    4: 不要在经常做DML 操作的表上建立索引
    5: 不要在小表上建立索引
    6: 限制表上的索引数目,索引并不是越多越好
    7: 删除很少被使用的、不合理的索引
    

    2 约束

    什么是约束

    1:约束(CONSTRAINT)的全称是约束条件,也称作完整性约束条件
    2:约束是在数据表上强制执行的一些数据检验规则,当执行 DML操作时,
       数据必须符合这些规则,如果不符合则无法执行。
    3:约束条件可以保证表中数据的完整性,保证数据间的商业逻辑。
    

    约束的类型

    1:非空约束(NOT NULL),简称 NN
    
       创建表时添加:
       CREATE TABLE employees(eid INT, NAME VARCHAR(30) NOT NULL,
       salary INT, hiredate DATE);
    
       修改表时添加:
       ALTER TABLE employees MODIFY eid INT NOT NULL;
    
       取消非空约束:
       ALTER TABLE employees MODIFY eid INT NULL;
    
    2:唯一性约束(Unique),简称 UK,不可重复的数据 如id。
    
       创建表时添加:两种方式,一种不指定名字, 一种指定名字
       CREATE TABLE employees(eid INT UNIQUE, NAME VARCHAR(30),
       email VARCHAR(50), salary INT, hiredate DATE,
       CONSTRAINT employees_email_uk UNIQUE(email));
       
       (上面 employees_email_uk 为约束名)
    
       修改表时添加:
       ALTER TABLE employees
       ADD CONSTRAINT employees_name_uk UNIQUE(NAME);
       
       查看约束:
       SHOW CREATE TABLE employees;
       
       删除:当做索引来删除
       ALTER TABLE employees
       DROP INDEX employees_name_uk;
       
       
    3:主键约束(Primary Key),简称 PK
    
       ◆主键(Primary Key)约束条件从功能上看相当于非空
       (NOT NULL)且唯一(UNIQUE 的组合)
       ◆主键应是对系统无意义的数据
       ◆一个表上只允许建立一个主键,而其它约束条件则没有明确的个数限制。
       ◆主键尽量建立在单列上
    
       创建表时,添加主键约束
       CREATE TABLE employees (eid INT PRIMARY KEY, //主键
       NAME VARCHAR(30),
       email VARCHAR(50),
       salary INT,
       hiredate DATE );
       
       在建表之后增加主键约束条件:
       ALTER TABLE book
       ADD CONSTRAINT book_eid_pk PRIMARY KEY(id);
       
       删除主键:
       ALTER TABLE employees
       DROP PRIMARY KEY;
       
    4:外键约束(Foreign Key),简称 FK
    
       ◆外键约束条件定义在两个表的字段或一个表的两个字
         段上,用于保证相关两个字段的关系
    
       创建外键约束之前,必须先把主表的主键建立
       ALTER TABLE department
       ADD CONSTRAINT department_eid_pk PRIMARY KEY(d_id);
       
       建表之后,添加外键约束
       ALTER TABLE employee
       ADD CONSTRAINT employee_deptno_fk  // 添加约束
       FOREIGN KEY(d_id)                  // 设置外键
       REFERENCES department(d_id);       // 关联
    
    5:检查约束(Check),简称 CK
    
    6:外键约束对一致性的维护
    
       ◆外键约束条件包括两个方面的数据约束
       ◆从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL;
       ◆当主表参照列的值被从表参照时,主表的该行记录不允许被删除。
       
       例子:
       INSERT INTO employees2(eid, NAME, d_id)
       VALUES(1001, 'rose', 1001); //成功
       
       INSERT INTO employees2(eid, NAME, d_id)
       VALUES(1001, 'rose', NULL); //成功
       
       INSERT INTO employees2(eid, NAME, d_id)
       VALUES(1001, 'rose', 11);  //失败,不存在部门 11
       
       DELETE FROM department WHERE d_id=1001; //失败,1001 被参照,不允许删除
    

    3 触发器

    什么是触发器

    1: 触发器(TRIGGER)是由事件来触发某个操作。
    2: 事件包括 INSERT语句、UPDATE语句和 DELETE语句。
    3: 当数据库系统执行这些事件时,满足触发器的触发条
       件时,数据库系统就会执行触发器中定义的程序语句。
    

    触发器作用

    1: 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。
    2: 审计。可以跟踪用户对数据库的操作
    3: 实现复杂的数据完整性规则
    4: 实现复杂的非标准的数据库相关完整性规则。
    5: 同步实时地复制表中的数据
    6: 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。
    

    创建触发器

       ◆一个表在相同触发时间的相同触发事件,只能创建一个触发器。
       
       创建只有一个执行语句的触发器的基本形式如下:  
       CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件
       ON 表名 FOR EACH ROW 执行语句;
       
       BEFORE 和 AFTER 参数指定了触发器执行的时间,
       “BEFORE”指在触发事件之前执行触发语句,
       “AFTER”表示在触发事件之后执行触发语句。
       
       触发事件参数指触发的条件。
       
       FOR EACH ROW表示任何一条记录上操作满足触发事件都会触发该触发器
    
       执行语句,指触发器被触发后执行的程序
    
        //建表 person
        CREATE TABLE person(NAME VARCHAR(20),sex CHAR(2),age INT);
        INSERT INTO person VALUE('武松','男',28);
        INSERT INTO person VALUE('大朗','男',29);
        INSERT INTO person VALUE('潘金莲','女',22);
        
        //建表 trigger_time 记录触发时间
        CREATE TABLE trigger_time(insert_time DATETIME);
        
    例:创建一个由INSERT触发的触发器person_trig.  
        CREATE TRIGGER person_trig
        BEFORE INSERT ON person
        FOR EACH ROW
        INSERT INTO trigger_time VALUES(NOW());
    
    
        向表person插入一条数据,查看是否触发了触发器。
        INSERT INTO person VALUE('西门庆','男',26);
    
        查看触发器执行结果
        SELECT * FROM trigger_time; //2017-11-30 21:13:39
    

    创建有多个执行语句的触发器

        DELIMITER &&
        CREATE TRIGGER person_trig2
        AFTER DELETE ON person
        FOR EACH ROW
        BEGIN
        INSERT INTO trigger_time VALUES(NOW());
        INSERT INTO trigger_time VALUES(NOW() + 1);
        END
        &&
        DELIMITER;
    
        向表person删除一条数据,查看是否触发了触发器。
        DELETE FROM person WHERE NAME = '西门庆'; 
        
        查看触发器执行结果
        SELECT * FROM trigger_time; //触发了两次
    

    查看触发器

    SHOW TRIGGERS;
    该语句无法查询指定的触发器,只能查询所有触发器的信息。
    

    触发器的使用

    1: 触发器执行的顺序是BEFORE 触发器、 表操作 (INSERT、UPDATE和 DELETE)和 AFTER 触发器。
    2: 在激活触发器时,对触发器中的执行语句存在一些限制。
       例如,触发器中不能包含 START TRANSACTION、COMMIT或 ROLLBACK等关键词,也不能包含 CALL 语句。
    3: 在触发器执行过程中,任何步骤出错都会阻止程序向下执行。
    

    删除触发器

    DROP TRIGGER dept_trig1;
    

    相关文章

      网友评论

          本文标题:day04 索引 约束 触发器

          本文链接:https://www.haomeiwen.com/subject/wlgmbxtx.html