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_relations
是 my_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;
在我的应用程序中,我有一个基于时间间隔复制行的存储过程。
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_relations
是 my_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;