删除数据库现有记录,同时将值从一行分配给具有唯一值的另一行

Posted

技术标签:

【中文标题】删除数据库现有记录,同时将值从一行分配给具有唯一值的另一行【英文标题】:Deleting database existing record while asigning values from one row to other with unique values 【发布时间】:2013-09-14 11:48:37 【问题描述】:

EDIT2:已解决感谢大家的快速回复,感谢您的帮助。特别感谢 Jeremy Smyth 先生的工作解决方案。

我对 sql 还很陌生,找不到进行更新查询的解决方案。我有下表

表:order

id | cid | pid 
1  | 1   |  a1 
2  | 1   |  a2
3  | 2   |  a2
4  | 2   |  a3
5  | 2   |  a4

我希望 2 的 cid 变为 1,但不更新具有相同 pid 的行,即(id.2 和 id.3)。 我想要的结果是:

id | cid | pid
1  | 1   |  a1
2  | 1   |  a2
3  | 2   |  a2
4  | '1' |  a3
5  | '1' |  a4

伪查询示例:UPDATE order SET cid=1 WHERE cid=2 AND 1.pid 2.pid;

EDIT1: 不要将 pid 值与 cid 和 id 混淆,我在开始时将它们更改为 'a'。正如建议的那样,我不会使用 order 作为表名。 在更新时,我根本不想要 cid 的重复 pid 抱歉英语不好。

【问题讨论】:

1.product_id2.product_id 是什么?这不是有效的 SQL 语法,并且您的表中没有 product_id 列(应该是 pid 吗?)。 你的问题不是很清楚。很难说出您想要什么,因为您提供的数据样本如此之小,而且您的解释不是很好。与什么“相同的 pid”? @Barmar 问题很明确。 pidcid 相同。 @meze 我不认为这就是他的意思。我怀疑他的意思是“与 cid = 2 的另一行相同的 pid” 不要使用保留字作为表名。它会让你发疯的! 【参考方案1】:

希望我的理解是正确的:

UPDATE `order`
   SET cid = 1 
 WHERE cid = 2 
   AND cid <> pid

你怎么看?

请注意:ORDER是保留字,read more。

【讨论】:

我更喜欢使用&lt;&gt; 而不是!=。但那是个人的。 See here 了解更多信息。 @Rik 感谢您的建议! @Mr.Bombastic 您的代码无效。它将每个字段的 cid 从 2 更新为 1。我不希望更新第三行 bcoz 会为 cid=1 创建重复项【参考方案2】:

我认为你需要这样的东西。

UPDATE order SET cid=1 WHERE cid=2 AND cid <> pid;

【讨论】:

您的代码无效。它将每个字段的 cid 从 2 更新为 1。我不希望更新第三行 bcoz 会为 cid=1 创建重复项【参考方案3】:

这只能在 mysql 中通过多个步骤(即不是单个 UPDATE 语句)来完成,因为以下几点

第 1 点:要获取与其他行不具有相同 pid 的行列表,您需要在更新前进行查询。例如:

SELECT id FROM `order` 
WHERE pid NOT IN (
   SELECT pid FROM `order`
   GROUP BY pid
   HAVING COUNT(*) > 1
)

这将为您提供与其他行共享pid 的ID 列表。但是我们必须处理 第 2 点,来自http://dev.mysql.com/doc/refman/5.6/en/subquery-restrictions.html

一般来说,您不能在子查询中修改表并从同一个表中进行选择。

这意味着您不能在 UPDATE 语句中使用这样的子查询。您将不得不使用临时表来存储基于该集合的pids 和UPDATE

例如,以下代码创建一个名为badpids 的临时表,其中包含在orders 表中多次出现的所有pids。然后,我们执行UPDATE,但只针对badpids列表中没有pid的行:

CREATE TEMPORARY TABLE badpids (pid int);

INSERT INTO badpids
   SELECT pid FROM `order`
   GROUP BY pid
   HAVING COUNT(*) > 1;

UPDATE `order` SET cid = 1
WHERE cid= 2 
AND pid NOT IN (SELECT pid FROM badpids);

【讨论】:

非常喜欢我的想法,但不知道该怎么做。我没试过。让我试着回复一下。是的 我太菜鸟了,你的 asnwer 是完美的,我认为我不能在同一张表中使用 select 和 update 的一件事。除了你的代码可以按照我的意愿和你的意图工作。在第二个查询中缺少一个次要类型的分号,这让我花了 7 次尝试找出它给出错误的原因。非常感谢:) 我的朋友也向我推荐了这个与 urs 相同的查询。更新order set cid='1' WHERE cid='2' and pid not in (select pid from (select distinct(pid) from order where cid='1') as temp_tbl) 如何将其标记为已回答?明白了,左侧的“勾号”检查。

以上是关于删除数据库现有记录,同时将值从一行分配给具有唯一值的另一行的主要内容,如果未能解决你的问题,请参考以下文章

VueJS - 重新加载页面后无法将值从 mapState 分配给数据属性

将值从另一个分配给CSV文件

将值从闭包赋值给变量 Swift

将值从向量分配给动态数组(C++)

使用相同的主键将值从一行添加到另一行 - Oracle SQL

自动递增值分配为输入,然后使用值从数据库中删除项目;