mysql - 不同表中的重复行以及与该 ID 相关的所有内容

标签 mysql sql

我正在开发一款软件,用于管理我老板的拉力赛公司,他可以在其中管理所有志愿者、他们的情感以及许多其他事情。 但是志愿者和其他事物因事件而异,因此他们都有一个列代表与他们链接/相关的事件。

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

原因是他经常组织集会,经常会出现一次集会(事件)到另一个集会的数据几乎相同的情况,所以与其手动全部添加,他宁愿制作一个整个重复事件以及与其相关的所有数据,然后手动添加和删除其中的错误。

我想知道,在 MySQL 中是否有任何方法可以复制事件以及链接到其 ID 的所有内容,即使它们位于不同的表中,并使重复项具有新事件的 ID ?

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

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

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

编辑2: 谢谢马德森先生的询问! 我必须稍微修复一下,但这就是修复后的样子。

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);

最佳答案

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

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

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

编辑

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

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)

关于mysql - 不同表中的重复行以及与该 ID 相关的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363242/

相关文章:

mysql - 使用其他行的 SUM() 和 COUNT() 更新一行

php - MySQL - 有效地插入 70000 个随机唯一字符串

mysql - 查询给定日期间隔内要向哪些客户开具发票

mysql - 管理频繁更新和查询的表

mysql - 优化大量更新查询

sql - 如何在 SQL 中为结果集中的每一行选择额外的行?

c# - 如果 ObjectContext.Refresh 方法无法连接到您的 SQL 服务器以执行刷新,如果您的 SQL 服务器不再可用,会发生什么情况?

php - 两个查询,两个不同的表,只有一个循环

mysql - 用于非常频繁的 GPS 数据收集的技术堆栈

mysql - Hibernate 不会在不同的操作系统下加载某些表