【问题标题】:MySQL - Update Column by Concatenating Field At Each RowMySQL - 通过在每一行连接字段来更新列
【发布时间】:2020-08-16 17:38:36
【问题描述】:

我有一张这样的桌子:

ID  Name   SignUp          Unique
1   James  August2020      JamesAugust2020  
2   Tom    August2020      TomAugust2020
3   Dick   September2020   DickSeptember2020
4   Larry  June2020        LarryJune2020
5   Sam    July2020        SamJuly2020
6   John   July2020        JohnJuly2020
7   Frank  March2020       FrankMarch2020
8   Jason  August2020      JasonAugust2020

如果要更改“注册”列,我想运行一个更新查询,该查询会将唯一列连接并更新为具有相同“注册”日期的每个人的新“注册”日期。

查看示例(如果所有“注册”日期都从 2020 年 8 月更改为 2020 年 4 月,我希望发生以下情况)

ID  Name   SignUp          Unique
1   James  April2020       JamesApril2020  
2   Tom    April2020       TomApril2020
3   Dick   September2020   DickSeptember2020
4   Larry  June2020        LarryJune2020
5   Sam    July2020        SamJuly2020
6   John   July2020        JohnJuly2020
7   Frank  March2020       FrankMarch2020
8   Jason  April2020       JasonApril2020

如何在 MySQL 中使用更新语句来做到这一点?

【问题讨论】:

  • 您是否有理由不只是在表上创建UNIQUE KEY (Name, Signup) 约束?那么你就不需要第四列了。
  • @BillKarwin 我不确定UNIQUE KEY 是如何工作的,我需要进一步研究这个概念才能正确实施。

标签: mysql sql sql-update


【解决方案1】:

如果您希望unique 是其他两列的串联,那么您应该将其定义为生成列:

alter tab t add column `unique` varchar(255) generated always as
    ( concat(name, signup) );

然后在表被查询并且没有必要(甚至不可能)更新列时生成。

【讨论】:

  • 看来这对于我正在寻找的东西来说可能是一个很好的选择,因为这种方法会减少一些查询编写和工作。我将进一步研究这个概念,并确定这是否可以在我的项目中实施。谢谢你。 @GordonLinoff
  • @JeremyLewis。 . .如果您想要一个始终与其余数据同步的列,这似乎是最佳解决方案。
【解决方案2】:

你可以这样做:

UPDATE tablename
SET SignUp = 'April2020',
    `Unique` = CONCAT(Name, SignUp)
WHERE SignUp = 'August2020'

在本次作业中:

`Unique` = CONCAT(Name, SignUp)

MySql 使用 SignUp 的更改值。

请参阅demo
结果:

| ID  | Name  | SignUp        | Unique            |
| --- | ----- | ------------- | ----------------- |
| 1   | James | April2020     | JamesApril2020    |
| 2   | Tom   | April2020     | TomApril2020      |
| 3   | Dick  | September2020 | DickSeptember2020 |
| 4   | Larry | June2020      | LarryJune2020     |
| 5   | Sam   | July2020      | SamJuly2020       |
| 6   | John  | July2020      | JohnJuly2020      |
| 7   | Frank | March2020     | FrankMarch2020    |
| 8   | Jason | April2020     | JasonApril2020    |

【讨论】:

  • 谢谢,这种方法最适合获得我正在寻找的结果。
【解决方案3】:

一种选择是将REPLACE() 用于Unique

UPDATE tab
   SET `SignUp` = 'April2020',
       `Unique` = REPLACE(`Unique`,'August2020', 'April2020')
 WHERE `SignUp` = 'August2020'

SignUp栏目更新期间

【讨论】:

  • 和上面一样,我之前没有使用过REPLACE 命令。我需要做进一步的研究来确定他的方法是否适用于我的用例。感谢您提请我注意此命令。 @BarbarosÖzhan
【解决方案4】:

表结构:

ID  Name   SignUp          Unique
1   James  August2020      JamesAugust2020  
2   Tom    August2020      TomAugust2020
3   Dick   September2020   DickSeptember2020
4   Larry  June2020        LarryJune2020
5   Sam    July2020        SamJuly2020
6   John   July2020        JohnJuly2020
7   Frank  March2020       FrankMarch2020
8   Jason  August2020      JasonAugust2020

如果所有“注册”日期都从 2020 年 8 月更改为 2020 年 4 月。

您可以使用 2 种方法进行更新:

方法一:

UPDATE TABLE
SET SignUp='April2020',
    UNIQUE = REPLACE(UNIQUE, 'August2020', 'APRIL2020')
WHERE SignUp='August2020';

您可以查看REPLACE的详细文档

方法二:

或者你可以尝试另一种方式,concatNameUnique专栏

UPDATE TABLE
SET SignUp = 'April2020',
    `Unique` = CONCAT(Name, SignUp)
WHERE SignUp = 'August2020'

【讨论】:

  • 之前没有使用过REPLACE命令,需要进一步研究这个概念来实现。但是,感谢您引起我的注意。 @AnkitJindal
猜你喜欢
  • 2014-11-02
  • 2020-01-02
  • 1970-01-01
  • 2021-03-25
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
相关资源
最近更新 更多