MySQL基础【事务、预编译、约束、分页】

1、事务

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

        事务的特点(ACID):

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

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

开启事务的步骤:

设置提交状态:SET AUTOCOMMIT = FALSE;
    或者显式的执行 start transaction
            或 begin
			
以第一个 DML 语句的执行作为开始

当出现以下语句之一,事务的执行结束:
    COMMIT 或 ROLLBACK 语句
    DDL 语句(自动提交)
    用户会话正常结束, 提交
    系统异常终止      回滚(代表事务执行失败)

SET AUTOCOMMIT = true;

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

2、预编译

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

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

prepare s1 from 'select * from teachers';

执行预编译,在另一个客户端不能执行
execute s1; 

丢弃预编译
drop prepare s1;

        预编译隶属于会话。

        插入预编译语句

prepare i1
from
    'insert into teachers(
        name,
        age,
        mobile
    ) values (
        ?,
        ?,
        ?
    )';

    在执行时预编译时, 代替?的实参必须要用用户变量
    set @变量名 = 值, @变量名2 = 值2;
    execute 预编译 using @变量名, @变量名2;

set @name = '微微',@age = 23, @mobile = '12345678911';
execute i1 using @name,@age,@mobile;
select * from teachers;

        删除预编译语句

prepare d1 from
'delete from teachers
where id = ?';

set @id = 8;

execute d1 using @id;

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

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

prepare i1
from
    'insert into teachers(
        name,
        age,
        mobile,
        gender
    ) values (
        ?,
        ?,
        ?,
        ?
    )';

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

prepare i2 from 
'
	insert into classes (
		name,
		student_count,
		room,
		master,
		begindate 
	) values (
		?,
		?,
		''606'',
		?,
		now() --函数调用
	)
';

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

3、约束条件

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

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

        丢弃唯一键约束

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

        丢弃主键

alter table test2
drop primary key;

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

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

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

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

--删除classes表
drop table if exists classes;
--新建classes表
create table if not exists classes(
	id int auto_increment,
	name varchar(30),
	student_count int,
	room char(3),
	master int, 
	begindate date,
	primary key(id),
	foreign key(master) references teachers(id)
);

        插入几条数据。 

insert into classes(
    name,
    student_count,
    room,
    master,
    begindate
) values (
    'MySQL',
    202201,
    '222',
    1,
    now()
);
insert into classes(
    name,
    student_count,
    room,
    master,
    begindate
) values (
    'MySQL1',
    202201,
    '222',
    2,
    now()
);
insert into classes(
    name,
    student_count,
    room,
    master,
    begindate
) values (
    'MySQL2',
    202201,
    '222',
    3,
    now()
);

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

show create table classes;

alter table classes 
drop foreign key 外键名;

        添加外键的三种额外选项               

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

        如 

alter table classes 
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子句必须放在整个查询语句的最后!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值