【问题标题】:updating columns with a sequence number mysql用序列号mysql更新列
【发布时间】:2011-09-30 19:36:33
【问题描述】:

我有一个包含列的表:(这只是我有 50K 记录的示例)

Name,   Number

Joe     Null
Michael Null
Moses   Null

我用 1-3 的序列号更新数字,所以它看起来像这样:

Name,   Number

Joe     1
Michael 2
Moses   3

如何在 SQL for Mysql 中通过一个 SQL 命令完成此操作

【问题讨论】:

  • 假定的订单基于什么?按字母顺序?
  • 没关系。我需要在数字中包含 1-3(1-size)的所有数字

标签: mysql sql sorting


【解决方案1】:
SET @rank:=0;
update T
set Number=@rank:=@rank+1;

更新

一个语句的替代方法

UPDATE T
JOIN (SELECT @rank := 0) r
SET Number=@rank:=@rank+1;

【讨论】:

  • 顺便说一句,如果需要,您可以将ORDER BY NAME 添加到该更新中:)
  • 当我运行上面的查询时,我得到 Data Truncated For Column... 错误
  • @LearnMore 该列的数据类型是什么?
  • @triclosan : 列数据类型为 BIGINT(11)。
  • @Bohemian:也许这是自 2011 年以来的新功能,但实际上您不能添加 ORDER BY,因为它是多表更新。不过This answer 解决了这个问题。
【解决方案2】:

您可以尝试将 Number 设置为 AUTO_INCREMENT,以便生成数字:

ALTER TABLE your_table MODIFY Number INT AUTO_INCREMENT

除此之外,您可能还需要: a) 存储的例程 b) 应用代码

【讨论】:

  • 这对我有用!谢谢。 (虽然我不得不说“ALTER TABLE table MODIFY COLUMN column int(11) AUTO_INCREMENT PRIMARY KEY;”才能让它工作。也许是版本问题。
【解决方案3】:

我努力在网上找到答案,发现以下方法对我有用,基于上面的一些信息,但使用不同的更新方法。在这里发帖以防其他人也有帮助。

注意:对于我的数据集,排名是一次性固定计算,不会改变。每次我将数据从 MySQL 拉入 Python 时,我想将其添加为列以节省运行计算。

我使用的解决方案:

  • 将排名设置为 0(如上)
  • 创建一个包含选择查询的临时表来计算排名
  • 使用计算的等级更新原始表。

使用的示例名称,rowid 是每行的唯一标识符,value 是将用于确定每行排名的指标

SET @rank=0;
CREATE TEMPORARY TABLE rank_temp
AS
(SELECT rowid, value, @rank:=@rank+1 AS rank FROM source_table ORDER BY value ASC);

UPDATE sourcetable a, rank_temp b
SET a.rank = b.rank
WHERE a.rowid = b.rowid;

这是一种粗略的方法,但对我的数据集有效。

【讨论】:

  • 有时可以在内部粗略代码中找到 gem,在我的情况下非常有用,确实是很棒的尝试
【解决方案4】:
update `table_name` set `Number`=@rank:=@rank+1

这将完成。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多