0

我正在尝试做与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')。

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

4

1 回答 1

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;
于 2013-10-23T10:55:22.870 回答