insert into table select from table where columnname = xxx and columnname2 = yyy 循环太多次

insert into table select from table where columnname = xxx and columnname2 = yyy looping too many times

我会尽可能做到完整而简洁。如果我遗漏了什么,请告诉我。

我有一系列活动,每个 activity 都包含完成给定 activity 所必需的步骤。每个步骤都有一些附加组件与该步骤一起进行。如果你把它看成一棵树,它看起来像这样:

ACTIVITY -- STEP ---- COMPONENT

下面是组件table.

的数据集结果

我想写一个 mySQL insert/select 语句,让我可以复制 ID = 84。不过在插入时,ID 值应继承 ACTIVITY 的新 ID(例如,让我们使用 299),而 AID 应继承 STEP 值的新 ID(例如,为此,让我们选择 501,502,503,504,505,506)。

我知道 mySQL 语句是什么样的,这不是问题所在。我 运行 遇到的问题是如何编写循环以便我可以传入新 ID 和新 AID 值。 SID 是主键(自动递增)。

根据上面给定的数据集,我预计会插入 6 条新记录。相反,我得到 9,所以我的循环没有正确循环或者我传递了错误的数据。

这是循环:

for (local.data.newAID in local.data.list_newAID){
    //  COPY SET
    for (local.data.origAID in local.data.list_existingAID){
        local.formDataStruct.origAID = local.data.origAID;
        variables.workoutDAO.makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID,
            origAID = local.dataStruct.origAID,
            newAID = local.dataStruct.newAID
        );
    }
}

这是 makeCopyCoreSet 函数:

INSERT INTO SET(ID, LID, AID)
SELECT
    :newID, LID, :newAID
FROM
    Set
WHERE ID = :origID AND AID = :origAID;

我错过了什么?

我们想要复制我们的一个活动,所以我们想要传递我们想要复制的ID和我们想要成为新ID的ID(除非我们有另一种方法来确定它。

variables.workoutDAO.NEW_makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID
        );

然后在我们的 NEW_makeCopyCoreSet() 函数(一个 CF 函数)中,我们有查询:

INSERT INTO component (ID, LID, AID)
SELECT DISTINCT :newID, LID, AID 
FROM component
WHERE ID = :origID

查看实际效果(从 SQL 方面):

https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=ba4328dca3327814a7dc18fea284ead8

首先我们设置我们的基础数据。

/* SETUP 1 */
CREATE TABLE component ( ID int, LID int, AID int, SID int UNIQUE AUTO_INCREMENT)

/* SETUP 2 */
INSERT INTO component (ID, LID, AID)
SELECT 84,0,432 UNION ALL
SELECT 84,0,433 UNION ALL
SELECT 84,0,434 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,436 UNION ALL
SELECT 84,0,437

/* What's in the original? */
SELECT * FROM component
ID | LID | AID | SID
-: | --: | --: | --:
84 |   0 | 432 |   1
84 |   0 | 433 |   2
84 |   0 | 434 |   3
84 |   0 | 435 |   4
84 |   0 | 435 |   5
84 |   0 | 435 |   6
84 |   0 | 435 |   7
84 |   0 | 436 |   8
84 |   0 | 437 |   9

然后我们将现有ID复制到新ID。

/* Copy an ID. */
INSERT INTO component (ID, LID, AID)
SELECT DISTINCT 299, LID, AID 
FROM component
WHERE ID = 84

/* What's in the table for the new ID? */
SELECT * FROM component WHERE ID = 299
 ID | LID | AID | SID
--: | --: | --: | --:
299 |   0 | 432 |  16
299 |   0 | 433 |  17
299 |   0 | 434 |  18
299 |   0 | 435 |  19
299 |   0 | 436 |  20
299 |   0 | 437 |  21