复制行的最简单方法

fip*_*cts 18 mysql

我能找到的最接近我想要做的是如何复制相关行,但我的经验不足让我迷失了方向。基本上,我想复制一些记录,更改一列并将它们插入同一个表中(因此它几乎是原始数据的副本)。

menuship是食物菜单的哈希表(表中的每一行都将标识一个菜单类别(例如开胃菜、主菜或甜点)和产品(鱼和薯条)。

表结构:

CREATE TABLE `menuship3` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `headhash` char(40) DEFAULT NULL,
  `menucardhash` char(40) DEFAULT NULL,
  `menucathash` char(40) DEFAULT NULL,
  `producthash` char(40) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `headhash` (`headhash`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

在编程界,我会说我想“分叉”我的数据......

如果我的表格内容是这样的:

ID 头哈希 菜单卡哈希 菜单现金 产品哈希
1 啊啊啊啊 啊啊啊啊 啊啊啊啊 啊啊啊啊
2 啊啊啊啊 啊啊啊啊 啊啊啊啊 bbb
3 啊啊啊啊 啊啊啊啊 啊啊啊啊 抄送
4 啊啊啊啊 啊啊啊啊 bbb 滴滴
5 啊啊啊啊 啊啊啊啊 抄送 ee
6 啊啊啊啊 其他 xyz fgi
7 啊啊啊啊 其他 xyz fgh

我想用 menucardhash aaa(第 1-5 行)复制所有记录,所以我最终会得到一个包含 12 条记录的表。额外的记录将有新的 menucarhash qqq 而不是 menucardhash aaa。

ID 头哈希 菜单卡哈希 菜单现金 产品哈希
8 啊啊啊啊 qq 啊啊啊啊 啊啊啊啊
9 啊啊啊啊 qq 啊啊啊啊 bbb
10 啊啊啊啊 qq 啊啊啊啊 抄送
11 啊啊啊啊 qq bbb 滴滴
12 啊啊啊啊 qq 抄送 ee

结果实际上意味着我有相似的记录,记录 1-5 与记录 8-12 相似 - 区别在于 id 和 menucardhash 列。

我只是要选择 PHP 中的记录,更改 menucathash 并将它们发送回数据库,但我想知道是否有 SQL 查询可以为我执行此操作,从而减少 cpu 周期开销。

这是否可以通过一两个查询实现,或者我最好让 PHP 承担重任?

ype*_*eᵀᴹ 27

这是一个非常简单的INSERT .. SELECT查询。

id不包含在列列表中,因为它有AUTO_INCREMENT物业,并会自动获取值。您只需要替换'aaa'为要从中复制的 menucardhash 值并'qqq' 使用新值:

INSERT INTO menuship3
    (headhash, menucardhash, menucathash, producthash)
SELECT 
    headhash, 'qqq', menucathash, producthash
FROM 
    menuship3
WHERE 
    menucardhash = 'aaa' ;
Run Code Online (Sandbox Code Playgroud)