MySQL权限篇之REFERENCES以及外键级联操作
REFERENCES,对象权限。
建立外键关系权限。
用户要在tb1上建立外键,外键指向tb2,那么该用户必须在tb2上有REFERENCES权限。
当然,还要有在tb1上alter的权限。
比如:
mysql> show grants for 'ut01'@'%';
+-----------------------------------------------------+
| Grants for ut01@% |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO 'ut01'@'%' |
| GRANT REFERENCES ON `test`.`sys_menu` TO 'ut01'@'%' |
| GRANT ALTER ON `test`.`sys_role_menu` TO 'ut01'@'%' |
+-----------------------------------------------------+
3 rows in set (0.00 sec)
mysql>
在sys_menu上有references权限,在sys_role_menu上有alter权限。
来看该用户的操作:
C:\Users\Administrator>mysql -u'ut01'
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.11-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> ALTER TABLE `test`.`sys_role_menu`
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE CASCADE ON DELETE CASCADE;
ERROR 1142 (42000): ALTER command denied to user 'ut01'@'localhost' for table 'sys_role_menu' #当该用户在sys_role_menu上没有alter权限时
mysql> ALTER TABLE `test`.`sys_role_menu`
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE CASCADE ON DELETE CASCADE;
Query OK, 4 rows affected (1.19 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>
红色部分ON UPDATE CASCADE ON DELETE CASCADE;表示当父表列值变更时,子表的动作为级联更改。
ON UPDATE CASCADE 表示当父表更新时,子表也级联更新。
ON DELETE CASCADE 表示当父表删除时,子表也级联删除。
在定义外键关系时,父表的更新(或者删除)动作,可级联子表操作有如下四种定义方式:
CASCADE,表示子表列值随父表一起变化(更新也一起更新,删除也一起删除)。注意,子表上级联更改的列,不会激活触发器。
NO ACTION,表示父表列值被保护(阻止更改,不能有任何动作)。
RESTRICT,表示父表列值被保护(限制更改,不能有任何动作,效果和NO ACTION一致,其实就是NO ACTION的别名)。也是外键级联操作的默认行为。
SET NULL,表示父表列值被更改时,关联的子表列值置空(前提是子表该列属性可为NULL)。
对于非innodb表,还有一个方式是:SET DEFAULT,但是innodb表,该定义不合法。
下面是演示:
D:\temp>mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.11-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| sys_menu |
| sys_role |
| sys_role_menu |
+----------------+
3 rows in set (0.00 sec)
mysql> SELECT
-> *
-> FROM
-> `KEY_COLUMN_USAGE`
-> WHERE table_schema = 'test'
-> AND REFERENCED_COLUMN_NAME IS NOT NULL;
ERROR 1146 (42S02): Table 'test.key_column_usage' doesn't exist
mysql> SELECT
-> *
-> FROM
-> information_schema.`KEY_COLUMN_USAGE`
-> WHERE table_schema = 'test'
-> AND REFERENCED_COLUMN_NAME IS NOT NULL;
Empty set (0.01 sec)
#表示test库没有目前还没有外键关系存在
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 202 | 201 | 9002 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 202 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql>
下面建立外键关系:
mysql> ALTER TABLE `test`.`sys_role_menu`
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE CASCADE;
Query OK, 4 rows affected (0.83 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>
#已经添加父表更新,子表级联更新的外键。
当父表更新时:
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 202 | 201 | 9002 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 202 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql> update sys_menu set menuId=212 where menuId=202
Query OK, 1 row affected (0.12 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
| 212 | 201 | 9002 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 212 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql>
#可见,子表成功级联更新。这是CASCADE。
来看看NO ACTION:
mysql> ALTER TABLE `test`.`sys_role_menu`
-> DROP FOREIGN KEY `sys_role_menu_ibfk_1`;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0 先删除原有的外键
mysql> ALTER TABLE `test`.`sys_role_menu`
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE NO ACTION;
Query OK, 4 rows affected (0.99 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
| 212 | 201 | 9002 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 212 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql> update sys_menu set menuId=202 where menuId=212;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`sys_role_menu`, CONSTRAINT `sys_role_menu_ibfk_1` FOREIGN KEY (`rmenMenuId`) REFERENCES `sys_menu` (`menuId`) ON UPDATE NO ACTION)
mysql>
NO ACTION,在父表列值上不能有任何动作。
接下来轮到RESTRICT:
mysql> ALTER TABLE `test`.`sys_role_menu`
-> DROP FOREIGN KEY `sys_role_menu_ibfk_1`,
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE RESTRICT;
Query OK, 4 rows affected (1.63 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
| 212 | 201 | 9002 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 212 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql> update sys_menu set menuId=202 where menuId=212;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`sys_role_menu`, CONSTRAINT `sys_role_menu_ibfk_2` FOREIGN KEY (`rmenMenuId`) REFERENCES `sys_menu` (`menuId`))
mysql>
被限制操作。父表列值被限制操作,效果和NO ACTION一致。也是默认的级联行为。
继续看看SET NULL:
mysql> ALTER TABLE `test`.`sys_role_menu`
-> DROP FOREIGN KEY `sys_role_menu_ibfk_2`,
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE SET NULL;
ERROR 1215 (HY000): Cannot add foreign key constraint
mysql>
外键约束添加失败,原因是子表rmenMenuId列NOT NULL导致:
mysql> ALTER TABLE `test`.`sys_role_menu`
-> DROP FOREIGN KEY `sys_role_menu_ibfk_2`;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE `test`.`sys_role_menu`
-> CHANGE `rmenMenuId` `rmenMenuId` BIGINT(20) NULL,
-> ADD FOREIGN KEY (`rmenMenuId`) REFERENCES `test`.`sys_menu`(`menuId`) ON UPDATE SET NULL;
Query OK, 4 rows affected (0.91 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
| 212 | 201 | 9002 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | 212 |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql> update sys_menu set menuId=202 where menuId=212;
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from sys_menu;
+--------+--------------+-----------+
| menuId | menuParentId | menuUrlId |
+--------+--------------+-----------+
| 201 | 0 | 9001 |
| 202 | 201 | 9002 |
| 203 | 201 | 9003 |
| 204 | 202 | 9004 |
| 205 | 203 | 9005 |
| 206 | 204 | 9006 |
| 207 | 201 | 9007 |
| 208 | 202 | 9008 |
+--------+--------------+-----------+
8 rows in set (0.00 sec)
mysql> select * from sys_role_menu;
+--------+------------+------------+
| rmenId | rmenRoleId | rmenMenuId |
+--------+------------+------------+
| 301 | 101 | 201 |
| 302 | 101 | NULL |
| 303 | 101 | 205 |
| 304 | 102 | 206 |
+--------+------------+------------+
4 rows in set (0.00 sec)
mysql>
和文档描述一致。
MySQL权限篇之REFERENCES以及外键级联操作相关推荐
- 外键 级联操作 mysql
外键 级联操作 mysql 级联就是联动的操作 如果主表中 级联更新 效果,请表ID变化,从表关联的数据也发生变化 级联更新 如果主表中的数据删除 从表中与它相关联的数据也删除 演练代码 -- 级联更 ...
- mysql外键级联操作_Mysql 外键级联
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...
- MySQL表联合查询 理论基础:外键、操作关联表(一)
前言 什么是外键? 外键是指引用另一个表的一列或多列,被引用的列应该具有主键约束或唯一性约束.外键用于建立和加强两个表数据之间的连接 先创建一张班级表t_class 不会创建外键的看 https:// ...
- 多表操作-外键级联操作
目录 外键的级联更新和级联删除 什么是级联更新 什么是级联删除 添加级联更新 添加级联删除 同时添加级联更新和级联删除 实例演示 添加外键约束,同时添加级联更新和级联删除 添加后测试 外键的级联更新和 ...
- oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE
在项目中,我们一般在数据库设计的时候做主外键关联设计,要么就不做.但是这样不符合规范,呵呵. 建立主外键关系的时候,默认是不能级联删除的.而出现往往在删除主表的数据时报错, 需要先删除从表然后再删除主 ...
- mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败
mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败. 添加显示成功后,可以轻松删除父表.
- mysql navicat如何为表添加外键?
mysql navicat如何为表添加外键? 1.使用Navicat设置 打开设计表项: 点击外键项: 外键是当前表可以指向其他表的主键或数据唯一属性的属性. 当前表的sno属性是一个外键,它参考的是 ...
- MySQL级联优缺点_【Mysql】外键级联与级联的劣势
在建表的时候时候,可以对于删除delete.修改update设置为级联.用一个例子先说明外键级联级联的概念 假如数据库中本以存在一张usertable如下: 此user表非常简单,id为主键. 下面我 ...
- mysql级联删除外键约束_mysql增加外键级联删除示例
增加外键级联删除: ALTER TABLE `extends` ADD CONSTRAINT `extends_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES ` ...
最新文章
- 13委托和事件在观察者模式中的应用
- 2022,前端工具链十年盘点
- Docker swarm 实战-部署wordpress
- iOS 高效 Mac 配置
- 传统输电线路巡检难?无人机这回立了大功!
- 《VC++深入详解》学习笔记 第十六章 线程同步与异步套接字编程
- linux下syslog命令,syslog命令
- 敢从头写一个OFFICE,你这么厉害,怎么不来解几个BUG
- [MetalKit]37-Using-ARKit-with-Metal使用ARKit与Metal
- android7.0电话录音,芒果录音手机版-芒果通话录音app(电话通话录音软件)下载7.3.2官方安卓版-西西软件下载...
- DS18B20温度传感器
- java表白程序_Java实现表白小程序
- word新建文档默认文件名_如何更改保存Word文档时使用的默认文件名
- Android源代码目录结构
- 构建自己的个人信息资料库
- IDEA创建applicationContext.xml文件图标不是xml文件图标
- Unity 语音识别以及音频可视化
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
- 我所知道坦克大战(单机版)之Client窗口的创建、关闭、禁止调整大小
- java查询城市区号,java根据手机号获取归属地
热门文章
- 所有系统如何创建宽带连接服务器,如何设置本地连接和宽带连接(打印机).doc
- 《Total Commander:万能文件管理器》——第2.5节.问题:我适合用TC吗?
- 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】
- PVE虚拟机黑群晖联机失败解决方法!
- 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!
- 2023最新微信ipad协议 834 附近人获取 CODE sessionId
- 城市规划计算机辅助设计技术第二部分,城市规划计算机辅助设计
- W800/Nepture/Hi3861/BL602 Harmony OS IOT Linux下开发环境搭建
- 从移动2G、3G、4G和iphone5s说起的手机那点事
- 楷书书法规则_1.硬笔书法--楷书规则