我正在尝试执行与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] 删除。
我来说两句