- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想要这个...
当更新或删除操作影响的行数大于1000时,禁止。
我怎样才能做到这一点?
最佳答案
MySQL 没有内置功能来实现此禁止,自动取消影响多于 N 行的 DML 语句(INSERT、UPDATE 或 DELETE 语句)。
而且实际上并没有一种方法可以对任何和所有可能执行的 INSERT、UPDATE 或 DELETE 语句实现这种限制。
我们可以采用多种方法来实现这种限制,但所有这些方法都需要一些额外的 SQL 语句和逻辑。
一种可能性是运行单独的“预检查”查询,使用与要发出的 UPDATE 或 DELETE 语句相同的条件,并收集将受影响的行数。然后检查返回的计数以确定是否应该发出 UPDATE 或 DELETE。此方法不对 DML 语句本身提供任何限制或禁止。这些是需要在实际 DML 语句之外执行的额外步骤。
要实现这种类型的限制,另一种可能性是在跟踪触发触发器次数的特定表上实现 FOR EACH ROW TRIGGER。
触发器需要在用户定义的变量(例如 @rowlimit
)中递增计数器,并且需要将累积计数器与指定限制(编码到触发器中)进行比较,然后 SIGNAL
(或以其他方式抛出错误)当达到或超过指定的限制时。抛出错误将导致操作被取消。
这种方法还需要在发出每个 INSERT、UPDATE 或 DELETE 语句之前将用户定义的变量重置为零的初步语句,例如设置@rowlimit = 0
。
请务必注意,不会为受 FOREIGN KEY 约束操作影响的行触发触发器。为了还包括这些行的计数,父表上的更新前/删除前触发器需要执行查询以查找子表中会受到影响的行数。
要全面实现这种限制,对于很多表,需要定义很多触发器。
如果我们不禁止 DML 语句影响任何行,而是允许 DML 语句影响一定数量的行,并且在达到该限制时停止,允许为了成功完成语句,我们可以在 DML 语句上添加 LIMIT 子句。这种方式显然需要修改DML语句,并没有禁止整个操作。它仅指定“最大”行数,当达到“最大”数时,语句将停止处理更多行,留下“最大”行数受影响,并成功完成。
禁止影响多于 N 行的 DML 语句的唯一方法是完全禁止所有可能影响多于 0 行的 DML 语句(y 撤销 UPDATE、DELETE 和 INSERT 权限。
作为替代方案,我们可以创建执行明确定义的“更新和删除操作”的 MySQL 存储程序(即过程)。这些过程可以定义 (DEFINER
) 以在确实有权对表执行 DML 语句的用户权限下运行。其他用户可以被授予对这些过程的 EXECUTE
权限,这样这些用户就可以执行定义明确的“更新和删除”操作。
这些方法都不能完全满足规范...禁止影响超过指定行数限制的 DML 操作。
关于MySQL 5.6 : how to limit the number of update or delete operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42522997/
好吧,我对我的页面发生的事情有点困惑。我在底部有页码, table 上摆满了 23 种不同的元素。 每个页面应一次显示 5 个项目。我显示的页面发送了一个带有 pagenumber = 不管怎样的 g
几周前我开始学习 Ada。我知道 limited 在某些情况下声明了一个有限类型,不允许复制对象 来自 Ada Reference Manual 2012 7.5 1/2 A limited type
我想按 DESC 选择日期并限制为最后 3 个,然后我需要基本上翻转最后 3 个结果,以便它们按 ASC 排序 任何帮助将不胜感激,我正在使用 postgresql 最佳答案 SELECT * FRO
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
我正在尝试访问按“日期”键排序的表中恒定数量的最新文档。请注意,不幸的是,日期是被实现的(不是由我......),使得该值设置为字符串,例如“2014-01-14”,或者有时“2014-01-14 2
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我必须对我的数据应用分页。我通过复杂的连接查询获取数据,没有任何子查询,只有简单的连接。 假设这个查询[这是一个非常简单的查询,我有一个比这个复杂的查询] SELECT states.state
我经常制作条形图,并将条形图的值额外包含为注释 (geom_text)。通常,我更喜欢这些值右对齐(与将标签放在条形顶部相反)。在绘制多面条形图时,我将这些值放在每个组中的最大值(我之前计算过)加上我
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
我正在使用 PostgreSQL 9.3。这应该在具有 100,000 多行的任何表上重现。 EXPLAIN ANALYZE 显示使用 LIMIT 2 扫描了更多行,但我不明白为什么。 限制 1: E
我正在尝试找出是否可以在 PHP 中全局设置和取消设置 MySQL 结果的默认限制。 一些可能看起来像的伪代码: $pdo->prepare('SELECT * FROM example'); $pd
我有下面的代码片段表 在这里我必须对投票前 3 个值求和。 假设 product_id 3030 vote 列的总和为 8.1 和 3671 总和 是 5.2 在这里,我必须获得前 3 个 produ
我正在使用全文搜索来提取行。 我根据分数 (ORDER BY SCORE) 对行进行排序,然后在前 20 行 (LIMIT 20) 中,我想对结果集进行兰德 (RAND)。 因此,对于任何特定的搜索词
帮助创建搜索条件 SELECT * FROM mlt_adr_city WHERE name LIKE "Text%" AND region_id = 59 AND id <> 0 IF (name
MySQL 查询示例: SELECT message_id, message_text FROM messages LIMIT 0 , 30 我得到的这个提示是错误的: HIN
我注意到如果我将查询限制为 1 个而不是 5 个,速度会急剧下降。 SELECT he. * FROM homematic_events he WHERE he.homematic_devices_i
我需要从我的表中获取最后一个 ID,以便我可以在另一个函数中使用它我在我的存储库中创建了这个函数,但我没有工作,它显示了一个错误: [Syntax Error] line 0, col 60: Err
我是一名优秀的程序员,十分优秀!