当前位置: 首页 > 知识库问答 >
问题:

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

韶镜
2023-03-14

我搜索了互联网、文档和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的表要禁用安全模式,请在首选项中切换选项-

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

共有2个答案

劳仲渊
2023-03-14

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

为什么我们不直接使用第3列和第4列的条件来引用要更新的行呢

UPDATE mySchema.myTable t
   SET t.myColumn = CONCAT( t.myColumn , '...')
 WHERE t.column3 = 'testdata'
   AND t.column4 = 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 , '...')

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

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   
冯亮
2023-03-14

啊,我不知道这是否是唯一的答案,但我能够通过这样做来使它工作:

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;

这就成功了。

 类似资料:
  • 这是表的create表 我在这里做错了什么?为什么在where子句中使用主键时会出现这个错误?

  • 这很混乱,因为我的where子句确实使用了主键列。我知道我可以禁用安全模式作为我的脚本的一部分作为一个变通办法,但仍然想要理解为什么我会得到这个错误。如果可能的话,我希望避免不安全的更新。

  • 以前很多次,当我尝试在mySQL表中设置/更新/删除某些内容时,它会给出 错误代码: 1175年。您正在使用安全更新模式,并且您尝试更新不使用使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换首选项中的选项 - 我可以通过在where子句中包含一个涉及主键的真实条件来解决这个问题。 但是,为什么以下方法不起作用? LiftID是一个varchar,是主键。 更新:根据Bill Karwi

  • 问题内容: 我有一个名为表有三列:,,。 我正在尝试创建一个查询,该查询将根据昵称返回余额,并且在使用此查询时遇到错误: 有人可以在这里看到我做错了吗? 问题答案: 反引号(`)用于标识符,例如表名,列名等。单引号(’)用于字符串文字。 您想做: 或者,更明确地说: 如果没有歧义的可能性,并且表/列名称没有特殊字符或空格,则可以将`设置为off。 这是一些干燥且难以阅读的文档:http : //d

  • 我正在MySQL上练习,我对“哪里”子句有疑问,为什么在MySQL中“where”后面的条件应该在主键中?如果我放了除主键以外的任何条件,那将是一个错误! 例如,我有一个名为“students”的表,表中有4列,第一列是“stuid”,它是主键,还有“stuname”、“classure”、“stuage”,这些是我不能说的其他列 < code >更新学生集stuname = ' Sarah '

  • 我试图从交易编号相同的<code>包 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有WHERE的表,该表使用了键列。要禁用安全模式,请在首选项中切换该选项- 下面是命令: 我认为我正在使用一个,其中使用了一个键列(< code>transactionNo是< code>Payment的主键)。我是不是写错了?