数据库:将数据从其他表导入另一个表

时间:2014-06-24 12:44:26

标签: mysql sql

所以这是我的数据库groupofficecom My Database

我正在将元素从source导入到cal_eventscf_cal_events。数据库有一些我无法改变的规则:

  • cal_events.id是PRIMARY KEY并且有AUTO_INCREMENT
  • cf_cal_events.model_id是PRIMARY KEY, NOT 有AUTO_INCREMENT
  • cf_cal_events.model_id = cal_events.id
  • ID_ELEMENT是VIEW source
  • 的主要关键字
  • cf_cal_events.col_10 = source.ID_ELEMENT

我正在尝试执行一个定期添加sourcecal_eventscf_cal_events的元素的查询,因此需要应用以下内容:

  1. INSERT新事件(元素)INTO两个表,考虑到:

    • cal_events.id已自动增加,cf_cal_events.model_idcal_events.id获取其值,如上图所示。
    • source与目的地之间的关系是通过cf_cal_events.col_10列。
  2. UPDATE事件在源数据库中发生了变化。

  3. 在源数据库中删除了
  4. DELETE个事件(在源数据库中,有一个参数tinyint列ASUPPRIMER='1'

  5. 我不是要求别人去做我的工作,我正在寻求帮助解决我在代码中遇到的问题:

    1. 我可以将新项目插入cal_events,但我无法将项目插入cf_cal_events(结果全部重复)。那是我的尝试。

      WHERE cf_cal_events.model_id = cal_events.id
      

      INNER JOIN cf_cal_events
      ON cf_cal_events.model_id = cal_events.id
      

      都返回空结果

    2. 当我执行查询时,由于列的AUTO_INCREMENT,它会再次添加元素 ,但会添加新的id。问题是我无法使用REPLACE INTOON DUPLICATE KEY UPDATE因为PRIMARY KEY必须相同才能使其正常工作。

    3. 这是我的数据库的SQL Fiddle。 谢谢大家!

      这是我的插入代码:

      INSERT INTO groupofficecom.cal_events (
          calendar_id,
          user_id,
          start_time,
          end_time,
          name,
          description,
          location,
          ctime,
          mtime,
          muser_id,
          status
      )
      SELECT '5' AS calendar_id,
          '3' AS user_id,
          UNIX_TIMESTAMP(source.DATEDEBUT),
          UNIX_TIMESTAMP(source.DATEFIN),
          CONCAT(source.C219PRNOM,' ',source.C218NOM),
          source.TYPEACTIONS,
          source.C222LIEU,
          UNIX_TIMESTAMP(source.CREATEDATE),
          UNIX_TIMESTAMP(source.MODIF_DATE),
          '',
          'CONFIRMED' AS status
      FROM source;
      
      INSERT INTO groupofficecom.cf_cal_events (
          model_id,
          col_4,
          col_5,
          col_6,
          col_7,
          col_8,
          col_9,
          col_10
      )
      SELECT groupofficecom.cal_events.id,
          source.C221CODECLIENT,
          '' AS col_5,
          '0' AS col_6,
          source.C218NOM,
          source.C219PRNOM,
          source.TYPEACTIONS,
          source.ID_ELEMENT
      FROM source, groupofficecom.cal_events
      INNER JOIN cf_cal_events
          ON groupofficecom.cf_cal_events.model_id = groupofficecom.cal_events.id;
      

      第一个INSERT工作正常,但另一个返回空结果

1 个答案:

答案 0 :(得分:1)

SELECT groupofficecom.cal_events.id,
    source.C221CODECLIENT,
    '' AS col_5,
    '0' AS col_6,
    source.C218NOM,
    source.C219PRNOM,
    source.TYPEACTIONS,
    source.ID_ELEMENT
FROM source
INNER JOIN groupofficecom.cal_events
    ON groupofficecom.cal_events.calendar_id = 5
    AND groupofficecom.cal_events.user_id = 3
    AND groupofficecom.cal_events.start_time = UNIX_TIMESTAMP(source.DATEDEBUT)
    AND groupofficecom.cal_events.end_time = UNIX_TIMESTAMP(source.DATEFIN)
    ...
LEFT JOIN cf_cal_events
    ON groupofficecom.cf_cal_events.model_id = groupofficecom.cal_events.id
WHERE groupofficecom.cf_cal_events.model_id IS NULL

这是cf_cal_events的插入查询。您必须从源到cal_events连接条件,迁移数据的方式,以获取先前插入的cal_events-rows。然后你必须加入到model_id上面的cf_cal_events来获取这些cal_events,它们在cf_cal_events中还没有引用。最后,您必须选择cal_events.id作为cf_cal_events的model_id。