当前位置:   article > 正文

MySQL基础【事务、预编译、约束、分页】_表名 列名 预编译

表名 列名 预编译

1、事务

        将一个数据执行步骤的集合作为一个单元来处理,让一组逻辑操作单元当成一个单个的命令来执行,要么全部成功,要么全部失败,比如转账业务。

        事务的特点(ACID):

        A 原子性 : 不可分割 
        C 一致性 : 数据前后是一致
        I 独立性 : 事务间 (独立性有等级)
        D 持久性 : 事务一旦提交, 数据持久化。所有客户端看到的数据一样。

为什么使用事务:保证数据的安全性。

开启事务的步骤:

  1. 设置提交状态:SET AUTOCOMMIT = FALSE;
  2. 或者显式的执行 start transaction
  3. 或 begin
  4. 以第一个 DML 语句的执行作为开始
  5. 当出现以下语句之一,事务的执行结束:
  6. COMMITROLLBACK 语句
  7. DDL 语句(自动提交)
  8. 用户会话正常结束, 提交
  9. 系统异常终止 回滚(代表事务执行失败)
  10. SET AUTOCOMMIT = true;

        事务的测试:在第一个客户端执行 start transaction; delete from chinaCity; 开启第二个客户端,查看库中数据 select * from chinaCity; 发现仍然可以查询到,但想要修改表中数据,在事务没有提交或回滚之前是无法进行的。此时相当于多线程,线程一在事务没有完成之前,会锁住当前资源,最后恢复数据库原始设置 set autocommit = true;

2、预编译

        客户端将把需要执行的sql语句发送给服务器,在服务器内部进行编译执行,浪费时间。提前把SQL编译成可执行的, 在执行时只需要在服务器调用它即可,可以提升性能。

        语句格式:prepare 预编译名 from 'SQL'; 

  1. prepare s1 from 'select * from teachers';
  2. 执行预编译,在另一个客户端不能执行
  3. execute s1;
  4. 丢弃预编译
  5. drop prepare s1;

        预编译隶属于会话。

        插入预编译语句

  1. prepare i1
  2. from
  3. 'insert into teachers(
  4. name,
  5. age,
  6. mobile
  7. ) values (
  8. ?,
  9. ?,
  10. ?
  11. )';
  12. 在执行时预编译时, 代替?的实参必须要用用户变量
  13. set @变量名 = 值, @变量名2 =2;
  14. execute 预编译 using @变量名, @变量名2;
  15. set @name = '微微',@age = 23, @mobile = '12345678911';
  16. execute i1 using @name,@age,@mobile;
  17. select * from teachers;

        删除预编译语句

  1. prepare d1 from
  2. 'delete from teachers
  3. where id = ?';
  4. set @id = 8;
  5. execute d1 using @id;

        ? 只能代替值的部分, 表名, 列名绝不可以。

        编写多个同名的预编译语句不会报错,会将同名的预编译语句覆盖掉。

  1. prepare i1
  2. from
  3. 'insert into teachers(
  4. name,
  5. age,
  6. mobile,
  7. gender
  8. ) values (
  9. ?,
  10. ?,
  11. ?,
  12. ?
  13. )';

        在SQL中要想使用', 必须再加一个', 起到转义的作用。        

  1. prepare i2 from
  2. '
  3. insert into classes (
  4. name,
  5. student_count,
  6. room,
  7. master,
  8. begindate
  9. ) values (
  10. ?,
  11. ?,
  12. ''606'',
  13. ?,
  14. now() --函数调用
  15. )
  16. ';

        强烈依赖表结构的插入方式,不灵活,insert into classes values(值的列表);。

3、约束条件

        有以下六种约束:
                NOT NULL 非空约束,规定某个字段不能为空, 必须列级约束 
                UNIQUE  唯一约束,规定某个字段在整个表中是唯一的,推荐表级约束
                PRIMARY KEY  主键(非空且唯一)
                FOREIGN KEY  外键
                DEFAULT  默认值, 必须是列级

  1. create table test(
  2. id int auto_increment, --自增的属性必须设置为主键
  3. --name vatchar(20) unique, 列级约束,不推荐
  4. name varchar(20),
  5. phone varchar(20) not null, -- 必须是列级约束
  6. unique(name), -- 优先表级约束,因为更加灵活
  7. primary key(id)
  8. );

        丢弃唯一键约束

  1. alter table test
  2. drop key name;
  1. create table test2(
  2. id int auto_increment,
  3. name varchar(20),
  4. phone varchar(20) not null, -- 必须列级约束
  5. constraint myunique unique(name, phone), -- 可以表级约束, 联合键,两个都不能相同
  6. primary key(id)
  7. );

        丢弃主键

  1. alter table test2
  2. drop primary key;

        外键: 让一个表中的记录的值要引用到另一张表中的数据。

        一旦有了外键, 子表中插入数据必须要引用到真实的父表中数据,父表中不存在的数据会无法插入。
        一旦父表中的记录被子表引用, 当删除父表中的相关记录时, 不允许删除。

        语法格式:foreign key(本表的外键列) references 父表(父表主键)

        将classes表中的master属性与teachers表中的主键联结起来。

  1. --删除classes表
  2. drop table if exists classes;
  3. --新建classes表
  4. create table if not exists classes(
  5. id int auto_increment,
  6. name varchar(30),
  7. student_count int,
  8. room char(3),
  9. master int,
  10. begindate date,
  11. primary key(id),
  12. foreign key(master) references teachers(id)
  13. );

        插入几条数据。 

  1. insert into classes(
  2. name,
  3. student_count,
  4. room,
  5. master,
  6. begindate
  7. ) values (
  8. 'MySQL',
  9. 202201,
  10. '222',
  11. 1,
  12. now()
  13. );
  14. insert into classes(
  15. name,
  16. student_count,
  17. room,
  18. master,
  19. begindate
  20. ) values (
  21. 'MySQL1',
  22. 202201,
  23. '222',
  24. 2,
  25. now()
  26. );
  27. insert into classes(
  28. name,
  29. student_count,
  30. room,
  31. master,
  32. begindate
  33. ) values (
  34. 'MySQL2',
  35. 202201,
  36. '222',
  37. 3,
  38. now()
  39. );

        丢弃外键,必须要知道外键名。因为一个表中可能有多个外键。       

  1. show create table classes;
  2. alter table classes
  3. drop foreign key 外键名;

        添加外键的三种额外选项               

  1. alter table classes
  2. add foreign key(master) references teachers(id) 额外选项;
  1. on delete do nothing, 是默认选项, 在删除父表被引用的记录时不允许
  2. on delete cascade 级联删除, 当删除父表中的相关记录时, 子表中引用此记录的所有记录也会被删除。
  3. on delete set null 级联置空.当删除父表中的相关记录时, 子表中引用此记录的所有记录中的外键会置为null

        如 

  1. alter table classes
  2. add foreign key(master) references teachers(id) on delete cascade;

4、分页

        limit n, 把结果集截断成n条记录。

        limit m, n 把结果集中的m条略过, 再截断成n条记录。

        公式:
        (当前页数-1)*每页条数,每页条数
        SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;

        注意:
        limit子句必须放在整个查询语句的最后!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/425525
推荐阅读
相关标签
  

闽ICP备14008679号