锁定“本地” MySQL表

莫吉兹

我正在尝试执行与MySQL中所述相同的操作:如果table中不存在,请插入记录,但是我在命令行上运行它,因此我需要手动锁定表。这就是我所拥有的:

LOCK TABLES `mytable` WRITE;
INSERT INTO `mytable` (`mycolumn`)
SELECT * FROM (SELECT 'test') AS temp
WHERE NOT EXISTS ( 
  SELECT `mycolumn`
  FROM `mytable`
  WHERE `mycolumn` = 'test'
) LIMIT 1;
UNLOCK TABLES;

但是,当我运行此命令时,出现错误:

ERROR 1100 (HY000) at line 239: Table 'mytable' was not locked with LOCK TABLES

该命令可以在MySQL Workbench中正常执行而无需锁定/解锁。我的猜测是我需要锁定“ temp”表,但是我该怎么做呢?

LOCK TABLES `mytable` WRITE, <something> AS temp WRITE;

由于“ temp”不是数据库中的实际表,因此仅是(SELECT'test')。

我可以补充一下,我不想(只是)想要创建唯一索引的原因是,这会导致产生一个我不知道如何处理的错误,因为命令行过程的退出代码始终仅为1 in错误的情况下,我真的不想为此解析stderr ...

西里尔

MySQL手册页中的LOCK TABLES很好地记录了这种行为。

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

您不能在使用相同名称的单个查询中多次引用锁定的表。请改用别名,并为表和每个别名获取一个单独的锁:

因此,这应该为您工作:

LOCK TABLES `mytable` WRITE, `mytable` as m2 READ
INSERT INTO `mytable` (`value`) SELECT * FROM (SELECT 'test') AS temp
WHERE NOT EXISTS ( 
  SELECT `value`
  FROM `mytable` as `m2`
  WHERE `value` = 'test'
) LIMIT 1;
UNLOCK TABLES;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章