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
属性。比如firstName
的John
,比如我想改姓为Wilson
。
我编写此查询是为了在提供名字时替换(或者如果不存在则自动创建行)姓氏。
REPLACE into `myTableName` (LastName, Username) VALUES ("Wilson", "jWilson") WHERE firstName = "John";
我希望此查询将John Brown
的记录更改为John Wilson
,并将jBrown
的用户名更改为jWilson
。如果名字为John
的行不存在,我还希望它创建一个新行,其值为John
作为firstName
和Wilson
作为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按列名替换表中的值的主要内容,如果未能解决你的问题,请参考以下文章