MySQL phpmyadmin - SELECT FOR UPDATE 无法识别

Posted

技术标签:

【中文标题】MySQL phpmyadmin - SELECT FOR UPDATE 无法识别【英文标题】:MySQL phpmyadmin - SELECT FOR UPDATE not recognised 【发布时间】:2018-03-27 21:41:24 【问题描述】:

我正在编写一个 php 程序,并希望实现行级锁定以避免用户同时更新/删除同一条记录。

但我在使用 SELECT FOR UPDATE 时遇到错误“无法识别的关键字”。表类型为 innoDB。

我是否缺少数据库的任何设置?

SELECT * FROM companyTable
WHERE companyId = "0000001"
FOR UPDATE;

错误 静态分析:

在分析过程中发现了 1 个错误。

无法识别的关键字。 (靠近位置 57 的“FOR”) SQL 查询:文档

SELECT * FROM companyTable WHERE companyId = "0000001" FOR LIMIT 0, 30

mysql 说:文档

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 30' at line 3

【问题讨论】:

什么是FOR ?? SELECT [...] FOR UPDATE 是 Oracle 数据库语法而不是 MySQL 语法。 【参考方案1】:

存在语法错误试试这个:

它选择从 1 到 30 的所有记录

SELECT * FROM companyTable WHERE companyId = "0000001" ORDER BY id LIMIT 30;

【讨论】:

我正在尝试使用 SELECT FOR UPDATE 语句锁定记录/阻止其他用户执行 UPDATE/DELETE 操作。【参考方案2】:

第一个问题似乎是,在您的 SQL 查询中缺少关键字 UPDATE

SELECT * FROM companyTable WHERE companyId = "0000001" FOR LIMIT 0, 30

第二个问题可能是,MySQL 中的 SELECT ... FOR UPDATE 语法不支持 LIMIT

所以你的 SQL 查询应该是:

SELECT * FROM companyTable WHERE companyId = "0000001" FOR UPDATE

在 phpmyadmin 中,很难删除自动添加的LIMIT 子句 - 尝试另一个 MySQL 客户端。

【讨论】:

【参考方案3】:

PhpMyAdmin 不是为处理(测试)事务控制而构建的,请改用 Mysql 控制台或 php 会话

并在代码之前使用“begin”开始事务

begin;

select * from `tblx` where `idx`=1 for update;

update `tblx` set `field`='xx' where `idx`=1;

commit;

【讨论】:

以上是关于MySQL phpmyadmin - SELECT FOR UPDATE 无法识别的主要内容,如果未能解决你的问题,请参考以下文章

Mysql+Phpmyadmin提权资料

phpmyadmin:MySQL 的表行数不正确

在 phpmyadmin 和 SQL Fiddle 上执行时相同 SELECT 查询的不同结果

相同的mysql查询在phpmyadmin的不同时间给出不同的结果

不同的Mysql日期结果在网站和PHPmyadmin中

MySQL 查询在 PHP 中返回 0 行,在 phpmyadmin 中返回实际记录