mysql外键,锁
mysql外键:
场景:用于建立两个表之间的联系,让A表中一个字段,可以在另一个表中字段值的范围去查找
注意事项:
(1)被参照表和参照表字段属性必须一致
(2)参照表必须设置主键
(3)必须选择支持外键的
外键:foreign key 表A字段名
references 表B 字段名
如何新增外键:
例子:创建test5员工姓名表,和test6员工工资表,在test6表查询员工工资
mysql> create table test5 (name char(30),primary key(name),age tinyint(90));
Query OK, 0 rows affected (0.01 sec) mysql> desc test5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | char(30) | NO | PRI | NULL | |
| age | tinyint(90) | YES | | NULL | |
插入两个员工信息
mysql> insert test5 values ('zhangsan',30),('lisi',40);
查看下test5表内容
mysql> select * from test5;
+----------+------+
| name | age |
+----------+------+
| lisi | 40 |
| zhangsan | 30 |
+----------+------+
创建test6表,并设置外键
mysql> create table test6 (name char(40),money int(100),foreign key(name) references test4(name));
#foreign key(当前表外键字段)
#references test4(name)被参照表的表名和字段,中间不能有逗号
如果在test6表中插入数值,范围必须从test5中的主键字段里面选值
先查看下test5的数据内容
mysql> select * from test5;
+----------+------+
| name | age |
+----------+------+
| lisi | 40 |
| zhangsan | 30 |
+----------+------+ 去test6表插入其他名字的字段会有外键约束
mysql> insert test6 values ('www',99),('zhongguo',57);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db1`.`test6`, CONSTRAINT `test6_ibfk_1` FOREIGN KEY (`name`) REFERENCES `test4` (`name`)) 插入lisi 看看
mysql> insert test6 values ('zhangsan',99);
Query OK, 1 row affected (0.01 sec) mysql> select * from test6;
+----------+-------+
| name | money |
+----------+-------+
| lisi | 22 |
| zhangsan | 99 |
+----------+-------+
如何修改外键,同步修改同步删除:on update cascade on delete cascade
mysql> create table test6 (name char(100),money int(99),foreign key(name) references test5(name) on update cascade on delete cascade);
mysql> update test5 set name='hhh' where age=55;
Query OK, 1 row affected (0.01 sec)
查看test5和test6的值就是一样的
如何删除外键里面的数据:
mysql> delete from test5 where name='zhangsan';
Query OK, 1 row affected (0.01 sec) mysql> select * from test5;
+------+------+
| name | age |
+------+------+
| hhh | 55 |
+------+------+
1 row in set (0.00 sec) mysql> select * from test6;
+------+-------+
| name | money |
+------+-------+
| hhh | 888 |
+------+-------+
1 row in set (0.00 sec)
如何查看外键:
show create table test5;
如何删除外键约束:
导入数据(需禁用SElinux):
格式:load date infile '文件的绝对路径' into table table_name fields terminated by '文件分隔符' lines terminated by '\n';
数值比较:
select name,UID from table_name where UID > 0; #查找UID大于0的名字
select name,UID from table_name where UID > 0 and UID < 100 #查找UID在0-100间的名字
select name from table_name where describe = 'root'; 查看
limit排序,限制显示行数
select * from table_name limit 1,2;
#第一行不显示,显示第二三行
如何设置属性的默认值
mysql> create table t7 (name char(30),primary key(name),age tinyint(90) default 23);
#创建t7表,创建名字字段并且设置为主键,创建age字段,默认是23 插入数据:
mysql> insert t7 (name) values ('zhangsan');
Query OK, 1 row affected (0.00 sec) mysql> select * from t7;
+----------+------+
| name | age |
+----------+------+
| zhangsan | 23 |
+----------+------+
1 row in set (0.00 sec)
不进入数据库查询某个表的一列字段
select 表名.字段名 from 数据库名.表名;
例子:mysql> select t7.name from db1.t7 ;
+----------+
| name |
+----------+
| zhangsan |
+----------+
多表查询:
格式:select * from 表1名,表2名 where 表1名.字段名=表2名.字段名;
例子:mysql> select * from test3,test4 where test3.name=test4.name;
+------+--------+--------+---------+-------+------+------+
| name | gender | hobby3 | address | money | name | age |
+------+--------+--------+---------+-------+------+------+
| lisi | NULL | NULL | NULL | NULL | lisi | 30 |
+------+--------+--------+---------+-------+------+------+
左连接查询:
格式:select 字段名 from 表a left join 表2 on 表1名.字段名=表1名.字段名;
例子:查看下test3和4
mysql> select * from test4;
+----------+------+
| name | age |
+----------+------+
| lisi | 30 |
| wanger | 10 |
| zhangsan | 10 |
+----------+------+
3 rows in set (0.00 sec) mysql> select * from test3;
+------+--------+--------+---------+-------+
| name | gender | hobby3 | address | money |
+------+--------+--------+---------+-------+
| lisi | NULL | NULL | NULL | NULL |
| 10 | NULL | NULL | NULL | NULL |
+------+--------+--------+---------+------- 以3为准左连查询:
mysql> select test3.name from test3 left join test4 on test3.name=test4.name;
+------+
| name |
+------+
| lisi |
| 10 |
+------+ 以test4为准右连查询:
mysql> select test3.name from test3 right join test4 on test3.name=test4.name;
+------+
| name |
+------+
| lisi |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)
#以test4为准,test3里面没有这个值所有显示Null
mysql存储引擎
1.MyISAM
特点:mysql5.5之前默认是MyISAM版的存储引擎
不支持事务
表级锁
读写相互阻塞,写的时候不能读,读的时候不能写
读取速度快,占用资源少
不支持mvcc高并发
崩溃恢复性较差
使用场景:只读,写入情况比较少,表比较小,能接受长时间进行修复操作
MyISAM物理文件:
.frm表格式定义
.myd数据文件
.myi索引文件
2,InnoDB
特点:支持行级锁
支持MVCC多并发控制
支持事务,适合处理大量短期事务
读写阻塞与事务隔离级别有关
崩溃恢复性好
5.5后作为默认存储引擎
InnoDB数据文件:
表数据和索引在同一个表空间
数据文件:ibdatal datadir
表格式文件:frm datadir 下的数据库对应目录下
查看所有的存储引擎:
show engines;
查看当前默认存储引擎:
show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name | Value |
+----------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
mysql锁机制
读锁:共享锁 S 只读不可写,包含当前事务,多个读不阻塞
写锁,X写锁会影响其他事务的读写操作,不包含当前事务
读锁例子:
格式:locak table 表名 read;
例子: lock table test3 read;
查看这个表:select * from test3;
插入数据:insert test3 (name) values ('wanger');
ERROR 1099 (HY000): Table 'test3' was locked with a READ lock and can't be updated 写锁:
格式:lock table 表名 write;
例子:
案例:找到未完成的导致 阻塞的事务
#在第一个会话中开启一个事务
mysql> use db1;
mysql> begin;
mysql> update date set name="centos";
mysql> select * from date;
#在第二个会话中执行(不需要开启一个事务)
mysql> select * from db1.date;
mysql> update date set name="rhel";
#在运维管理会话
mysql> show engine innodb status\G;
#查看当前正在进行的事务
mysql> select * from information_schema.innodb_trx\G;
#查看当前锁定的事务
mysql> select * from information_schema.innodb_locks\G;
#查看当前等锁的事务
mysql> select * from information_schema.innodb_lock_waits\G;
如何解决?
#查看事务列表
mysql> show processlist;
mysql> show processlist;
+----+------+-----------+------+---------+------+---------------------------------+----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+---------------------------------+----------------------+
| 3 | root | localhost | db1 | Sleep | 6800 | | NULL |
| 4 | root | localhost | NULL | Sleep | 3850 | | NULL |
| 5 | root | localhost | db1 | Sleep | 56 | | NULL |
| 6 | root | localhost | db1 | Query | 19 | Waiting for table metadata lock | select * from test4 |
| 9 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+---------------------------------+----------------------+
5 rows in set (0.01 sec)
杀死lock:
mysql >kill 事务id;
可以通过show processlist和查看系统事务得到
#查看事务锁的超时时长,默认50s
mysql> show global variables like 'innodb_lock_wait_timeout';
mysql外键,锁的更多相关文章
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- Mysql 外键设置
MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给 ...
- MySQL外键的作用和创建
MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...
- Mysql外键的使用
MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...
- mysql 外键和子查询,视图
1.mysql 外键约束 建表时生成外键 foreing key ('sid') references' student'('id'); 建表后添加外键 alter table' course ...
- mysql外键使用和事物使用
mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...
- Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491 版权声明:本文为博主原创文章 ...
随机推荐
- JVM原理与深度调优
什么是jvm jvm是java虚拟机 运行在用户态.通过应用程序实现java代码跨平台.与平台无关.实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都 ...
- Effective Java —— try-with-resources 优先于 try-finally
本文参考 本篇文章参考自<Effective Java>第三版第九条"Prefer try-with-resources to try-finally" The cod ...
- ACM - 图论- 网络流 - 算法模板
\(EK\) 算法模板 #include <iostream> #include <queue> #include<string.h> using namespac ...
- python学习笔记(六)——程序调试
在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...
- safari浏览器fixed后,被软键盘遮盖的问题—【未解决】
safari浏览器fixed后,被软键盘遮盖的问题,已经有好多人问相关的问题,应该是问的角度不一样,还的再次提出咯. 问题描述 测试环境:ios 10.2/10.3 简单来说就是在html5页面中底部 ...
- Android 预置APK
1. 预置apk,使其不可卸载 第一步: 在 "/vendor/huawei/packages/apps" 目录下创建一个对应名称的文件夹. 第二步: 将 ...
- Mybatis实现批量添加操作
Mybatis实现批量添加操作 学习内容: 1. 使用 2. 代码实现 2.1 UserMapper.java 接口 2.2 UserMapper.xml 总结: 学习内容: 1. 使用 这里通过动态 ...
- CommonsCollection4反序列化链学习
CommonsCollection4 1.前置知识 由于cc4没有新的知识点,主要是用cc2,然后稍微cc3结合了,所以我们可以看ysoserial源码,自己尝试构造一下,把cc2通过获取Invoke ...
- keytools命令生成证书
平时开发中可以使用keytools命令生成证书,一般常用格式为: keytool -genkey -alias tzzxxt -keyalg RSA -keypass 123456 -validity ...
- 【jenkins】04.SSH认证方式拉取Git代码
首先需要会git ssh 我们一般用http的形式拉取代码. ssh的好处就是不用每次输入密码,而且貌似会快丢丢,不知道是不是错觉. 大概需要三个步骤: 一.本地生成密钥对: 二.设置github上的 ...