MySQL按列名替换表中的值

Posted

技术标签:

【中文标题】MySQL按列名替换表中的值【英文标题】:MySQL Replace value in table by column name 【发布时间】:2021-12-30 21:05:30 【问题描述】:

我有一个如下所示的mysql 表,其中pKey 是primary_AI 密钥。

+------+-----------+----------+----------+
| pKey | firstName | LastName | Username |
+------+-----------+----------+----------+
|    1 | John      | Brown    | jBrown   |
|    2 | Jake      | Smith    | jSmith   |
|    3 | Mary      | Laurier  | mLaurier |
+------+-----------+----------+----------+

我想创建一个查询,当给定firstName 时,它可以替换LastName 属性。比如firstNameJohn,比如我想改姓为Wilson

我编写此查询是为了在提供名字时替换(或者如果不存在则自动创建行)姓氏。

REPLACE into `myTableName` (LastName, Username) VALUES ("Wilson", "jWilson") WHERE firstName = "John";

我希望此查询将John Brown 的记录更改为John Wilson,并将jBrown 的用户名更改为jWilson。如果名字为John 的行不存在,我还希望它创建一个新行,其值为John 作为firstNameWilson 作为LastName 以及将用户名更改为jWilson

我知道我可以通过多个查询来做到这一点,例如SELECT 名字,INSERT 如果它不存在,或者DELETE 记录和INSERT 如果它存在,则再次查询,但我我需要一次插入许多记录,并希望在单个查询中执行此操作。

我该如何解决这个问题?

【问题讨论】:

是否为列firstName定义了唯一约束? firstName 在本例中是唯一的 在您发布的示例数据中是唯一的,但在表中是否定义为唯一? 它在表中没有定义为唯一,但我知道它永远是唯一的 您是在导入数据还是更新特定行? 【参考方案1】:

为避免重复用户名,您应该使用:

alter table `myTableName` modify column username char(64) unique;

替换(删除然后更新)到表中

REPLACE into `myTableName` (Username) VALUES (CONCAT(SUBSTR(firstname,0,1),lastname))) WHERE firstName = "John";

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。

一旦它按照您想要的方式工作,请删除 WHERE

您也可以在重复更新时使用INSERT

insert into user (firstname,lastname,username) values ("frank","our",lcase(concat(substr(firstname,1,1),lastname))) ON DUPLICATE KEY UPDATE username=lcase(concat(substr(firstname,1,1),lastname));

如果您指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会发生旧行的 UPDATE。

要更新现有值,请使用UPDATE

UPDATE `myTableName` SET username =  LCASE(CONCAT(SUBSTR(firstname,0,1),lastname))) WHERE firstName = "John";

【讨论】:

它似乎可以在没有 WHERE 的情况下工作。但是,我不知道姓氏是什么,只知道名字。当给定John的名字值时,我想替换姓氏 第二个例子在更新值方面效果很好!如果它们不存在于同一个查询中,是否也可以创建这些值(假设除了 SQL 语句中提到的非替换值之外都可以是 null 或 AutoInc)【参考方案2】:

一种 hacky 方法可以做到这一点,因为您不想将 unique 约束添加到 first_name 列,即使您确定它是唯一的,也就是获取 firstName = 所在行的 pKey 'John',如果不存在,则使用 0 作为 pKey,让 mysql 为您获取下一个值:

 INSERT INTO table_name
 select (coalesce((select pKey from table_name where firstName = 'John'),
 0)) as pKey,
 'John' as firstName,
 'Wilson' as lastName,
 'jWilson' as userName
 on duplicate key update lastName = 'Wilson', userName = 'jWilson';

Fiddle

【讨论】:

以上是关于MySQL按列名替换表中的值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 修改表中的列名(急~~~)

如何通过存储过程更改列名并更改表中的值?

MySQL操作——增删改

如果 mySQL 中的表中存在列名/字段名,则搜索数据库

删除多个表中的列,其列名与另一个表中的值类似

按列名更新循环中的值