在不同的表中重复行和与该ID相关的所有内容

时间:2015-07-12 00:38:48

标签: mysql sql

我正在研究管理我老板拉力赛公司的软件,在那里他可以管理所有志愿者,他们的做法以及许多其他事情。 但是志愿者和其他人的事情因事件而异,所以他们都有一个专栏代表他们与之相关的事件。

我的老板要求我添加一个“重复”按钮,它会复制一个事件(来自我的事件表)并复制所有志愿者,以及链接到该事件的任何其他表中的值,因此新的重复与新事件有关。

之所以这样,是因为他经常组织集会,而且经常会发生从Rally(事件)到另一个的数据几乎相同的情况,所以他不是手动添加所有数据,而是制作一个整个事件的重复以及与之相关的所有数据,然后手动添加和删除其中的错误。

我想知道,在MySQL中有什么方法可以复制一个事件,以及与它的ID相关联的所有内容,即使它们位于不同的表中,并使重复具有新事件的ID ?

可悲的是,我没有太多时间,但在得到答案之前,我可以处理老板给我的其他任务。

非常感谢任何帮助我或给我任何暗示的人!!

编辑: 这是我的数据库的架构(我知道它有点脏,它有问题,我的老板给了我关于如何创建数据库的迹象,因为他以前在域中工作,但他没有告诉我如何制作链接,他想自己制作) 我为法语和奇怪的名字道歉.. 基本上我希望复制“事件”表中的条目,链接到它的所有“影响”和“替代”条目,以及与重复的“替代”条目相关的所有“环节”条目。 Database scheme (db_rallye)

编辑2: 谢谢MrMadsen的查询! 我不得不修理一下,但这就是它的样子。

SET @NEWEVEN = (SELECT MAX(NO_EVE) from db_rallye.event)+1;

INSERT INTO db_rallye.event
SELECT @NEWEVEN, 
       NM_EVE, 
       AN_EVE, 
       DT_EVE, 
       NM_REG_EVE
FROM event
WHERE NO_EVE = event_to_duplicate;

SET @NO_AFFECT_LIEU = (SELECT MAX(NO_AFF) from db_rallye.affect);
INSERT INTO db_rallye.affect
SELECT @NO_AFFECT_LIEU:=@NO_AFFECT_LIEU+1, 
       CO_AFF, 
       DT_AVI_AFF, 
       DS_STA_AFF, 
       CO_STA_AFF, 
       NO_BRA_EVN, 
       NO_PERS, 
       @NEWEVEN, 
       NO_EQU, 
       NO_LIE, 
       NO_PERS_RES, 
       IN_LUN, 
       IN_BAN,
       DS_HEB,
       IN_HEB_JEU, 
       IN_HEB_VEN, 
       IN_HEB_SAM, 
       NO_BOR, 
       NO_TUL_CAH, 
       NB_SPEC
FROM affect
WHERE NO_EVEN = event_to_duplicate;

INSERT INTO db_rallye.lieu
SELECT NO_LIE, 
       @NEWEVEN, 
       CO_LAT, 
       CO_LON, 
       FI_IMA, 
       FI_CRO, 
       FI_TUL, 
       DS_LIE, 
       DS_COU, 
       DS_LON, 
       NB_BLK,
       VL_KM, 
       IN_FUS,
       VL_DIS_FUS, 
       NO_LIE_FUS_SUI
FROM lieu
WHERE NO_EVEN = event_to_duplicate;

SET @NO_AFFECT_TACHE = (SELECT MAX(NO_TAC) from db_rallye.tache);
INSERT INTO db_rallye.tache
SELECT @NO_AFFECT_TACHE:=@NO_AFFECT_TACHE+1, 
       NO_LIE, 
       @NEWEVEN, 
       NO_AFF, 
       DS_REP, 
       DS_TAC
FROM tache
WHERE NO_LIE IN 
    (SELECT NO_LIE FROM lieu WHERE NO_EVEN = event_to_duplicate);

1 个答案:

答案 0 :(得分:1)

如果很多事件包含的信息类似于我创建的模板(或模板以及创建/修改模板的能力),其中包含您要复制的所有信息。

然后,当创建新事件时,他只需选择一个起始模板,然后只添加该事件唯一的数据。在我看来,这比不断复制数据要好得多。

至于如何复制行和所有关联的行,这完全取决于您的数据库模式以及表之间的关系。如果您发布相关部分,我们可以为您提供更多帮助。

修改

以下是我提出的查询,首先在开发数据库中测试它们,但我认为它们会起作用。让我知道。祝你好运!

INSERT INTO `event`
SELECT NULL NO_EVE, 
       NM_EVE, 
       AN_EVE, 
       DT_EVE, 
       NM_REG_EVE
FROM `email_log`
WHERE id NO_EVE = id_of_event_to_duplicate

INSERT INTO `affect`
SELECT NULL NO_AFF, 
       CO_AFF, 
       DT_AVI_AFF, 
       DS_STA_AFF, 
       CO_STA_AFF, 
       NO_BRA_EVN, 
       NO_PERS, 
       NO_EVEN, 
       NO_EQU, 
       NO_LIE, 
       NO_PERS_RES, 
       IN_LUN, 
       IN_BAN, 
       DS_HEB_JEU, 
       IN_HEB_VEN, 
       IN_HEB_SAM, 
       NO_BOR, 
       NO_TUL_CAH, 
       NB_SPEC
FROM `affect`
WHERE NO_EVE = id_of_event_to_duplicate

INSERT INTO `lieu`
SELECT NULL NO_LIE, 
       NO_EVEN, 
       CO_LAT, 
       CO_LON, 
       FI_IMA, 
       FI_CRO, 
       FI_TUL, 
       DS_LIE, 
       DS_COU, 
       DS_LON, 
       DB_BLK,
       VL_KM, 
       IN_FUS,
       VL_DIS_FUS, 
       NO_LIE_FUS_SUI
FROM `lieu`
WHERE NO_EVEN = id_of_event_to_duplicate

INSERT INTO `tache` 
SELECT NULL NO_TAC, 
       NO_LIE, 
       NO_EVEN, 
       NO_AFF, 
       DS_REP, 
       DS_TAC
FROM `tache`
WHERE NO_LIE IN 
    (SELECT NO_LIE FROM `lieu` WHERE NO_EVEN = id_of_event_to_duplicate)