【问题标题】:Update Value in Table from another table从另一个表更新表中的值
【发布时间】:2010-10-21 06:28:35
【问题描述】:

我意识到我正在使用 varchar 属性作为查询中的索引/键,这会影响我的查询性能。我正在尝试查看我的 precienct 表并获取整数 ID,然后使用新的 int FK 更新我在家庭表中的记录,并将其放置在新列中。这是我到目前为止写的sql。但我得到了一个

Error 1093 You can't specify target table 'voterfile_household' for update in FROM 子句,我不知道如何解决。

UPDATE voterfile_household
SET
PrecID = (SELECT voterfile_precienct.ID
        FROM voterfile_precienct INNER JOIN voterfile_household
        WHERE voterfile_precienct.PREC_ID = voterfile_household.Precnum);

【问题讨论】:

  • 如果我不得不处理拼写错误的表格,我想我的大脑会融化。请告诉我这是方言什么的。
  • 我什至没有注意到,我猜我拼错了一次,然后在我第一次输入时一直引用它。

标签: mysql sql mysql-error-1093


【解决方案1】:

试试:

update voterfile_household h, voterfile_precienct p
   set h.PrecID = p.ID
 where p.PREC_ID = h.Precnum

查看更新参考here

同样,您也可以使用 inner join 语法。

update voterfile_household h inner join voterfile_precienct p on (h.Precnum = p.PREC_id)
   set h.PrecID = p.ID

【讨论】:

    【解决方案2】:

    如果子查询返回多个结果怎么办?这就是它不起作用的原因。

    在 SQL Server 上,如果子查询执行“SELECT TOP 1 ...”,您可以让这种类型的东西工作,不确定如果您向子查询添加“限制 1”,mysql 是否也会接受它。

    我还认为这与今天早些时候的 this question ("Can I have an inner SELECT inside of an SQL UPDATE?") 几乎是重复的。

    【讨论】:

      【解决方案3】:

      首先,您在 varchar 上的索引并不总是一件坏事,如果它不是一个键,您可以缩小索引字段的数量以仅索引前 10 个字符左右。

      其次,它不会让你这样做,就好像它是一个返回它可能会破坏的集合。

      【讨论】:

      • 我应该说varchar是一个PK
      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2020-11-18
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多