如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

Posted

技术标签:

【中文标题】如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL【英文标题】:if same columns values are repeated in multiple rows then UPDATE - SQL / MYSQL 【发布时间】:2016-11-01 00:29:06 【问题描述】: 如果同一列值在多行中重复

然后根据列值

删除整行

更新基于相同列值

的新行(即其他列值)

我有一张这样的桌子

create table if not exists cms(
  id int(11) not null auto_increment primary key,
  cms_id varchar(20),
  published_datetime varchar(30),
  last_modified_datetime varchar(30),
  score float,
  access_vector varchar(45),
  access_complexity varchar(45),
  authentication varchar(45),
);


INSERT INTO `cms` (`id`, `cms_id`, `published_datetime`, `last_modified_datetime`, `score`, `access_vector`, `access_complexity`, `authentication`) VALUES
(1, 'CMS-2002-0493', '2002-08-12T00:00:00.000-04:00', '2016-10-24T11:23:01.940-04:00', 7.5, 'NETWORK', 'LOW', 'NONE')

现在在此表中,我不想允许重复值 名为 cms_id

的列

为此,我不想为 cms_id 列设置唯一键 因为此列值将重复,然后根据此列值cms_id其他列值可以更改

cms_id 可能与其他列可以获取的位置相同 不同的条目

每次具有相同的 cms_id 值的行中的其他列可能不同的条目

简单来说,如果 cms_id 的相同值重复,则更新整行(根据 cms_id 更新所有列)

现在我需要一个输出,比如只有最后插入的 cms_id 值应该出现在表中,其他所有相同的 cms_id 应该被删除并使用最后一个条目更新

主键为 1,613,1225 的列 ID 应删除,仅应存在 1837

我需要输出类似下图的东西

它应该完全按照最后一个条目替换重复的 cms_id 列。

因此,如果 cms_id 值重复,那么它应该删除现有的 cms_id 值,并且它应该根据最后一个插入条目更新所有其他列值,需要查询这个

【问题讨论】:

触发器可能会起作用,但我不熟悉这些。使用脚本语言来做到这一点也可能不是一个坏主意。 【参考方案1】:

mysql 有一个特殊的REPLACE 命令,其工作方式与INSERT 完全相同,只是它在主键或唯一键具有相同值时替换行。

REPLACE INTO cms ...

其中 ... 表示查询的其余部分。

免责声明:此 SQL 语句是 MySQL 的特殊扩展;它不是 SQL 标准的一部分,可能不适用于其他 DBMS。

【讨论】:

以上是关于如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL的主要内容,如果未能解决你的问题,请参考以下文章

如果具有相同的 id 和相同的值或值在 PHP 中为空,则合并行

基于列值向sql中的列添加行值

如果第二列值在SQL中不相同,则计算一列中的不同值

如果所需的列值重复 [重复],则 SQL 查询以获取顶部记录

R - 如果列值与字符向量中的任何值匹配,则返回它旁边的列 [重复]

根据第三列值在 bigquery 中选择两个不同的列