使用where子句的mySQL更新会引发主键错误

时间:2018-03-30 19:33:56

标签: mysql sql sql-update

我搜索了互联网,文档以及有关stackoverflow的广泛搜索,但无济于事。 我正在使用MySQL Workbench尝试在特定列的末尾连接一些其他值 我原来的代码是:

update mySchema.myTable
set myColumn = CONCAT( myColumn , 
', "a108": "Additional Data.",
"a109": "More Additional Data. "'
)
where primaryKeyColumn =
(
select primaryKeyColumn
from mySchema.myTable
where column3 = "testdata" AND column4 = aNumber
);

但是,这引发了错误“错误代码:1093。您无法为FROM子句中的更新指定目标表'转换'”。我在stackoverflow上搜索并将我的代码更改为:

update mySchema.myTable
set myColumn = CONCAT( myColumn , 
', "a108": "Additional Data.",
"a109": "More Additional Data. "'
)
where primaryKeyColumn in
(
select primaryKeyColumn from
(
select primaryKeyColumn
from mySchema.myTable
where column3 = "testdata" AND column4 = aNumber
) as tempTable
);

现在抛出“错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用KEY列的WHERE的表要禁用安全模式,请切换首选项中的选项 - > SQL编辑器和重新连接“。

我已经检查过,而且primaryKeyColumn绝对是主键。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

啊,我不知道这是否是唯一的答案,但我能够通过这样做得到它:

SET @myPrimaryKey = (select primaryKeyColumn from mySchema.myTable where column3 = "testdata" AND column4 = aNumber);
update mySchema.myTable
set myColumn = CONCAT( myColumn , 
', "a108": "Additional Data.",
"a109": "More Additional Data. "'
)
where primaryKeyColumn = @myPrimaryKey;

这样做了。

答案 1 :(得分:0)

我不明白为什么表需要被引用两次。

为什么我们不会直接使用column3和column4上的条件来引用要更新的行,例如

UPDATE mySchema.myTable t
   SET t.myColumn = CONCAT( t.myColumn , '...')
 WHERE t.column3 = 'testdata'
   AND t.column4 = aNumber

(我也不清楚aNumber是什么......如果它是对表格中某列的引用,那么最好的模式就是限定它。)

在更一般的情况下,我们有一个子查询来获取需要更新的行的标识符,我们通常可以使用内联视图,并在UPDATE中执行JOIN操作

UPDATE mySchema.myTable t
  JOIN ( SELECT q.primaryKeyColumn
           FROM mySchema.myTable q
          WHERE q.column3 = 'testdata'
            AND q.column4 = aNumber
       ) s
    ON s.primaryKeyColumn = t.primaryKeyColumn   
   SET t.myColumn = CONCAT( t.myColumn , '...')

我强烈建议在运行UPDATE之前先将其作为SELECT语句编写,然后查看结果。

SELECT s.primaryKeyColumn
     , CONCAT( t.myColumn , '...') AS newval_myColumn
     , t.myColumn                  AS oldval_myColumn
  FROM mySchema.myTable t
  JOIN ( SELECT q.primaryKeyColumn
           FROM mySchema.myTable q
          WHERE q.column3 = 'testdata'
            AND q.column4 = aNumber
       ) s
    ON s.primaryKeyColumn = t.primaryKeyColumn