锁定“本地”MySQL表

时间:2013-10-22 13:17:47

标签: mysql

我正在尝试执行MySQL: Insert record if not exists in 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中没有锁定/解锁时执行正常。我的猜测是我需要锁定“临时”表,但我该怎么做?

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

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

我可以补充一点,我之所以没有(只是)想创建一个唯一索引的原因是这会导致一个我不知道如何处理的错误,因为命令行进程的退出代码总是只有一个错误,我真的不想解析stderr ...

1 个答案:

答案 0 :(得分:1)

在LOCK TABLES的MySQL手册页中详细记录了这种行为;

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;