0
点赞
收藏
分享

微信扫一扫

MySQL主键与事务

时光已翩然轻擦 2022-03-11 阅读 53

创建表

mysql> create table yyqx(用户名 char(20),密码 int,余额 int);

写入内容:mysql> insert into yyqx values("张飞",123123,10000),("李四",123123,20000);

Select * from yyqx; 查看

在插入一行数据再插入一个张飞

如果想让某一列数据不重复主键

主键及自增

每一张表通常会有一个且只有一个主键 来表示每条数据的唯一性

主键其实是对某一个字段的 约束

主键特性;1.值不能重复 2.非空(不能赋值为null)

主键约束的写法;

主键+自增的写法:

删除主键

先把刚刚创建的张飞删掉:delete from yyqx where 密码=666666;

设置主键:alter table yyqx modify `用户名` char(20) primary key;#主#键

表设计

再设计表字段的时候,如果某个字段又可能出现大量的重复(称为数据)

需要把该字段单独提出创建一张新表,把可能重复的放在新表内,再原表只需要使用新表的Id即可

练习:

mysql> create database tmp; 
Query OK, 1 row affected (0.00 sec)
Use tmp;



mysql> create table emp (
    id int primary key auto_increment,
    name varchar(20),
    detpid int,
    joindate date
     );
Query OK, 0 rows affected (0.00 sec)
mysql> create table dept (
    -> id int primary key auto_increment,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.00 sec)
insert into dept (name) values ('财务');
insert into dept (name) values ('市场');
从两张表通过相同字段来查询它们分别是那个部的有哪些。
select dept.name,ddd.name from dept,ddd where dept.id=ddd.detpid;
+--------+--------+
| name   | name   |
+--------+--------+
| 财务   | 小明   |
| 财务   | 小红   |
| 市场   | 小白   |
| 市场   | 小绿   |
+--------+--------+

只查市场部
select dept.name,ddd.name from dept,ddd where dept.id=2 and ddd.detpid=2;
+--------+--------+
| name   | name   |
+--------+--------+
| 市场   | 小白   |
| 市场   | 小绿   |
+--------+--------+

Mysql事务

数据库:关系型数据库(支持事务) 非关系型数据库(不支持)

数据库事务概述

什么是事务(transaction)

保证成批操作要么完全执行,要么完全不执行,维护数据的完整性。也就是要么成功要么失败。

一个事务包含多条sql语句,而且这些sql语句之间存在一定的关系

事务可以是n条sql语句(n>=0)

不是所有数据库引擎支持事务,lnnoDB引擎支持事务处理

数据库事务特性;(ACLD)

一个事务中存有10条sql语句,那么咱在执行事务的时候,其实就是在执行那十条sql语句,这10条sql页边距只有全部执行成功,事务才会成功,只要有1条失败,那么整个事务就会失败

比如a用户有1000块钱,B也有1000块钱,A用户给B用户转500,那么A用户和B用户的前的总额为多少?2000

事务并发不进行事务隔离

1.脏读:事务A读到未提交事务B修改的数据,如果此时

事务B中途执行失败回滚,那么此时事务A读取到的就是脏数据

  1. 不可重复读:同一个事务中,对同一份数据读取的结果不一致。事务A在事务B对数据更新前进读取,然后事务B更新提交,事务A再次读取,这时侯两次读取的数据不同。
  2. 幻读:同一个事务中,同一个查询多次返回的结果不一样。事务B查询表的记录数,然后 事务A对表插入一条记录,接着事务B再次查询发现记录数不同。

区别

脏读和不可重复读:脏读是事务读取了还未提交的更新数据。不可重复读,几次读取的数据不同。

不可重复读和幻读的区别:前者是几次读取数不同,后者是几次读取数据整体不同。

隔离级别

隔离级别

作用

Serializable(串行化)

避免脏读,不可重复读,幻读

Repeatable(可重复读)

避免脏读,不可重复读

Read committed(读已提交)

避免脏读

Read uncommitted(读未提交)

none

mysql支持上面4种隔离级别,默认为可重复读

MySQL数据库管理事务:

管理事务:

mysql> create database linuxfan; #创建一个数据库
mysql> use linuxfan; #指向Linuxfan
mysql> create table it (岗位 char(20),姓名 char(20),身份证 char(18),学历 char(10),工资 int);
mysql> show create table it;
mysql> insert into it values('Php工程师','曹操','13231088322','本')','9000');
查一下表内容:mysql> select * from it; 
Exit退出然后再进数据库刚刚写的内容还在。
开始事务之前首先要敲一个:begin; #开始事务
插入一行数据:insert into it values('Php工程师','赵云','13231088322','本','9500');
查一下mysql> select * from it;  在里面, 没有提交退出数据库重新进发现赵云消失了。
Commit; #提交事务 退出重进

自动提交查mysql> show variables like '%autocommit%';
mysql> set autocommit=0;
Rollback:
Begin;一下插入一行数据
关掉自动提交
set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
mysql> begin;
再插入一行
输入:mysql> rollback; #回滚刚刚插入的一行没有了
举报

相关推荐

0 条评论