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以及外键级联操作相关推荐

  1. 外键 级联操作 mysql

    外键 级联操作 mysql 级联就是联动的操作 如果主表中 级联更新 效果,请表ID变化,从表关联的数据也发生变化 级联更新 如果主表中的数据删除 从表中与它相关联的数据也删除 演练代码 -- 级联更 ...

  2. mysql外键级联操作_Mysql 外键级联

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  3. MySQL表联合查询 理论基础:外键、操作关联表(一)

    前言 什么是外键? 外键是指引用另一个表的一列或多列,被引用的列应该具有主键约束或唯一性约束.外键用于建立和加强两个表数据之间的连接 先创建一张班级表t_class 不会创建外键的看 https:// ...

  4. 多表操作-外键级联操作

    目录 外键的级联更新和级联删除 什么是级联更新 什么是级联删除 添加级联更新 添加级联删除 同时添加级联更新和级联删除 实例演示 添加外键约束,同时添加级联更新和级联删除 添加后测试 外键的级联更新和 ...

  5. oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE

    在项目中,我们一般在数据库设计的时候做主外键关联设计,要么就不做.但是这样不符合规范,呵呵. 建立主外键关系的时候,默认是不能级联删除的.而出现往往在删除主表的数据时报错, 需要先删除从表然后再删除主 ...

  6. mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败

    mysql myisam存储引擎不能添加外键,添加后显示成功,实则失败. 添加显示成功后,可以轻松删除父表.

  7. mysql navicat如何为表添加外键?

    mysql navicat如何为表添加外键? 1.使用Navicat设置 打开设计表项: 点击外键项: 外键是当前表可以指向其他表的主键或数据唯一属性的属性. 当前表的sno属性是一个外键,它参考的是 ...

  8. MySQL级联优缺点_【Mysql】外键级联与级联的劣势

    在建表的时候时候,可以对于删除delete.修改update设置为级联.用一个例子先说明外键级联级联的概念 假如数据库中本以存在一张usertable如下: 此user表非常简单,id为主键. 下面我 ...

  9. mysql级联删除外键约束_mysql增加外键级联删除示例

    增加外键级联删除: ALTER TABLE `extends` ADD CONSTRAINT `extends_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES ` ...

最新文章

  1. 13委托和事件在观察者模式中的应用
  2. 2022,前端工具链十年盘点
  3. Docker swarm 实战-部署wordpress
  4. iOS 高效 Mac 配置
  5. 传统输电线路巡检难?无人机这回立了大功!
  6. 《VC++深入详解》学习笔记 第十六章 线程同步与异步套接字编程
  7. linux下syslog命令,syslog命令
  8. 敢从头写一个OFFICE,你这么厉害,怎么不来解几个BUG
  9. [MetalKit]37-Using-ARKit-with-Metal使用ARKit与Metal
  10. android7.0电话录音,芒果录音手机版-芒果通话录音app(电话通话录音软件)下载7.3.2官方安卓版-西西软件下载...
  11. DS18B20温度传感器
  12. java表白程序_Java实现表白小程序
  13. word新建文档默认文件名_如何更改保存Word文档时使用的默认文件名
  14. Android源代码目录结构
  15. 构建自己的个人信息资料库
  16. IDEA创建applicationContext.xml文件图标不是xml文件图标
  17. Unity 语音识别以及音频可视化
  18. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
  19. 我所知道坦克大战(单机版)之Client窗口的创建、关闭、禁止调整大小
  20. java查询城市区号,java根据手机号获取归属地

热门文章

  1. 所有系统如何创建宽带连接服务器,如何设置本地连接和宽带连接(打印机).doc
  2. 《Total Commander:万能文件管理器》——第2.5节.问题:我适合用TC吗?
  3. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】
  4. PVE虚拟机黑群晖联机失败解决方法!
  5. 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!
  6. 2023最新微信ipad协议 834 附近人获取 CODE sessionId
  7. 城市规划计算机辅助设计技术第二部分,城市规划计算机辅助设计
  8. W800/Nepture/Hi3861/BL602 Harmony OS IOT Linux下开发环境搭建
  9. 从移动2G、3G、4G和iphone5s说起的手机那点事
  10. 楷书书法规则_1.硬笔书法--楷书规则