MySQL:复制"parent"条记录后,从其他表中复制相关记录

MySQL: Copy related records from other tables after copying "parent" record

在我的应用程序中,我有一个基于时间间隔复制行的存储过程。

INSERT INTO my_table (
    <field list>
) 
SELECT 
<field list>,
CASE rwo_frequency
WHEN 2 then DATE_ADD(start_date, INTERVAL 7 DAY)
WHEN <other values for rwo_frequency>
END AS start_date,
FROM my_table
WHERE start_date = CASE rwo_frequency
WHEN 2 then DATE_ADD(CURDATE(), INTERVAL -7 DAY)
WHEN <other values for rwo_frequency>
END
AND is_recurring = 1;

复制完这些行后,我还需要将它们的相关记录复制到另一个table。例如,my_table 有一个名为 my_relations 的相关 table,其结构如下:

+------------------+------------+------+-----+---------+----------------+
| Field            | Type       | Null | Key | Default | Extra          |
+------------------+------------+------+-----+---------+----------------+
| id               | int(11)    | NO   | PRI | NULL    | auto_increment |
| wa_id            | int(11)    | YES  |     | 0       |                |
| related_doc_id   | int(11)    | YES  |     | 0       |                |
| is_parent        | int(5)     | NO   |     | 0       |                |
| created          | datetime   | YES  |     | NULL    |                |
| created_user_id  | int(11)    | NO   |     | 0       |                |
| modified         | datetime   | YES  |     | NULL    |                |
| modified_user_id | int(11)    | NO   |     | 0       |                |
| deleted_record   | tinyint(1) | YES  |     | 0       |                |
| deleted_user_id  | int(11)    | YES  |     | NULL    |                |
| deleted          | datetime   | YES  |     | NULL    |                |
+------------------+------------+------+-----+---------+----------------+

在这个table中,wa_id是指向my_table的外键。 my_relations 中有一条记录,其值如下:

select id, wa_id, related_doc_id from my_relations;
+----+-------+----------------+
| id | wa_id | related_doc_id |
+----+-------+----------------+
|  1 |     1 |            286 |
+----+-------+----------------+

假设我在 my_table 中复制记录 ID 1,它的 ID 为 10。我需要的是能够在 my_relations 中复制上面显示的记录,但 [=24] =].我已经试过了:

INSERT INTO my_relations (
wa_id,
related_doc_id,
created,
created_user_id
)
SELECT
wa.id,
related_doc_id,
NOW() AS created,
wa.resp_engineer_id AS created_user_id
FROM my_table wa
LEFT JOIN my_relations d
ON wa.id = d.wa_id
WHERE wa.created = CURDATE()
AND wa.is_recurring = 1;

我唯一想不通的是如何将 related_doc_id 的值放入我的新记录中。插入记录后它总是出现 NULL。然而,wa_id 是正确的。我认为 join 会处理它,但显然不会。我如何复制这一行,以便复制后我的结果集是这样的?

select id, wa_id, related_doc_id from my_relations;
+----+-------+----------------+
| id | wa_id | related_doc_id |
+----+-------+----------------+
|  1 |     1 |            286 |
|  2 |    10 |            286 |
+----+-------+----------------+

编辑:有人问我 table 之间的关系。 my_relationsmy_table 和另一个名为 docs 的 table 之间的链接 table。 wa_id是指向my_table的外键,related_doc_id是指向docs的外键。复制其 my_table 记录时必须复制此关系。旧 ID 和新 ID 之间的关系在 my_table 中名为 copied_wo 的列中。当第 1 行被复制并获得 ID 10 时,copied_wo第 10 行的值更新为 1,表明第 10 行是从中复制的。

您需要使用 copied_wo 列将 my_table 与其自身连接起来,这样您就可以从链接到 [= 中原始行的 my_relations 行中获得 related_doc_id 12=].

INSERT INTO my_relations (wa_id, related_doc_id, created, created_user_id)
SELECT wa1.id, d.related_doc_id, NOW(), wa1.resp_engineer_id
FROM my_table wa1  -- new row
JOIN my_table wa2 ON wa1.copied_wo = wa2.id  -- original row it was copied from
LEFT JOIN my_relations AS d ON wa2.id = d.wa_id  -- related row of original
WHERE wa1.created = CURDATE() AND wa1.is_recurring = 1;