【问题标题】:Target table not updateable? Creating a sequence column with ORDER BY目标表不可更新?使用 ORDER BY 创建序列列
【发布时间】:2013-09-30 21:40:09
【问题描述】:

我正在输入以下查询,但收到表不可更新的错误消息?

SET @rownumber = 0;
UPDATE (
SELECT _atc_codes.se, diagnoses.*
FROM diagnoses
JOIN _atc_codes
ON (_atc_codes.id = diagnoses.atc_code)
ORDER BY _atc_codes.se, diagnoses.year, diagnoses.county, diagnoses.age_group, diagnoses.gender) AS b
SET b.base_order_index = (@rownumber:=@rownumber+1)

我想要实现的是通过添加一个序列列来加快我的查询速度,我可以对我的结果进行排序,而不是在多个列上进行排序。它基于一个涉及 5 列的 ORDER BY 子句,其中之一来自 JOINed 表。

【问题讨论】:

  • 您想更新一个临时子查询。那是行不通的。
  • @juergend 我尝试将UPDATEORDER BY 一起使用,但随后出现错误“不正确使用带有ORDER BY 的UPDATE”,所以我看到有人建议使用此解决方案相反,但它显然也不起作用。
  • 您是否尝试将序列列添加到临时查询或表中?您显然正试图在查询中这样做
  • @silkfire:您可以在问题中添加示例数据和预期输出吗?我无法回答您的问题。
  • @juergend 这是一个自动增量,基于使用我的ORDER BY 子句的结果顺序 :)

标签: mysql join sql-update


【解决方案1】:

如果您正在寻找自动增量,请按照以下示例进行操作。如果您不关心速度,只需将表替换为您的子查询

SELECT mycols, @n := @n + 1 AS rownum
   FROM MYTABLE , (SELECT @n := 0) as rownumstart

获取您的订单:

step1 添加要加入的 rownum

step2 更新表,以正确的顺序将它与同一张表的子查询连接起来,将 table.rownum 与 subquery.new_rownum 连接起来

ALTER MYTABLE ADD rownum int (11) unsigned NULL DEFAULT NULL;

UPDATE MYTABLE ,

  (SELECT @n := 0) AS ALIAS
SET rownum=@n := @n + 1 ;


UPDATE TABLE
INNER JOIN
  (SELECT ordered.*, @n := @n + 1 AS rownum
   FROM
     (SELECT WITH your
      ORDER WITHOUT rid
      FROM TABLE) AS ordered,

     (SELECT @n := 0) AS ALIAS) ordered_with_rownum ON ordered_with_rownum.rownum=TABLE.rownum
SET TABLE.columnA=ordered_with_rownum.columnA,
          TABLE.columnB=ordered_with_rownum.columnB ....

【讨论】:

  • 我想要自动递增,但作为永久表列的一部分,而不是在 SELECT 语句中。
  • try: ALTER MYTABLE ADD rownum int (11) unsigned null default null;更新表,(SELECT @n := 0) set rownum=@n := @n + 1
  • 你错过了最相关的事情,这是我所追求的具体顺序。
  • 最简单和最快的方法是创建具有自动增量的表,从原始表中以正确的顺序插入数据,删除原始表,重命名新表。在处理器上也快得多。如果您将表格用于实时应用程序,则不可行。删除和重命名表应该很快就没有人注意到发生了什么:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多