2017-05-28 59 views
4

我有一個難以解決的問題,我不知道該怎麼做。存檔一些繼承的實體

我想歸檔一些實體,然後從初始表中刪除它們。問題是這些實體是連在一起的。我有一個接近工作的代碼,但我認爲這不是一個乾淨的方法。它由SQL查詢組成,這些SQL查詢將具有ID的行復制到新表中。 另一個問題是我不需要一些字段來歸檔,因此歸檔實體與初始實體不完全相同。 由於我的表的大小,我正在使用原始SQL查詢而不是DQL。

我要存檔這些實體:科爾,ColleQC,QC,PasserColle,效應初探,ReponseQC,StatistiqueColle,StatistiqueQuestion,RepartitionColle,RepartitionQuestion,Tuteur TO BanqueColle,BanqueColleQC,BanqueQC,BanquePasserColle,BanqueReponse,BanqueReponseQC,BanqueStatistiqueColle,BanqueStatistiqueQuestion ,BanqueRepartitionColle,BanqueRepartitionQuestion,AncienAdherent。

我會將這些存檔用於我的應用的另一部分。

樣本表結構的:enter image description here

(Tuteur和AncienAdherent擴展用戶)

這是我做歸檔代碼的一部分,但我不認爲這是一個乾淨的方式來做到這一點:

public function archiveTuteurs() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO ancien_adherent (id) 
       SELECT u.id 
       FROM user u 
       WHERE discr = 'tuteur'"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    $query2 = "UPDATE user 
       SET user.discr = 'ancien' 
       WHERE discr = 'tuteur'"; 
    $stmt = $db->prepare($query2); 
    $stmt->execute(); 

    return true; 
} 

public function archiveColles() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO banque_colle (id, typeColle, nom, temps_epreuve, matiere_id, dateCreation, ordre, discr) 
       SELECT colle.id, colle.typeColle, colle.nom, colle.temps_epreuve, colle.matiere_id, colle.dateCreation, colle.ordre, colle.discr 
       FROM colle"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    $query2 = "INSERT INTO banque_colle_qc (id) 
       SELECT colle_qc.id 
       FROM colle_qc"; 
    $stmt = $db->prepare($query2); 
    $stmt->execute(); 

    return true; 
} 

public function archiveQC() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO banque_qc (id, titre, id_colle, ordre, qcPere, enonce, donnees, item1, item2, item3, item4, 
          item5, corrige_item1, corrige_item2, corrige_item3, corrige_item4, corrige_item5, item1_vrai, 
          item2_vrai, item3_vrai, item4_vrai, item5_vrai, item1_annule, item2_annule, item3_annule, 
          item4_annule, item5_annule, multiple_choices, inclu) 
       SELECT qc.id, qc.titre, qc.id_colle, qc.ordre, qc.qcPere, qc.enonce, qc.donnees, qc.item1, qc.item2, 
        qc.item3, qc.item4, qc.item5, qc.corrige_item1, qc.corrige_item2, qc.corrige_item3, qc.corrige_item4, 
        qc.corrige_item5, qc.item1_vrai, qc.item2_vrai, qc.item3_vrai, qc.item4_vrai, qc.item5_vrai, 
        qc.item1_annule, qc.item2_annule, qc.item3_annule, qc.item4_annule, qc.item5_annule, 
        qc.multiple_choices, qc.inclu 
       FROM qc 
       ORDER BY qc.qcPere ASC"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    return true; 
} 

public function archivePassages() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO banque_passer_colle (colle_id, dateDebut, note) 
       SELECT passer_colle.colle_id, passer_colle.dateDebut, passer_colle.note 
       FROM passer_colle"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    return true; 
} 

public function archiveReponses() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO banque_reponse (id, discr) 
       SELECT reponse.id, reponse.discr 
       FROM reponse 
       WHERE discr='reponseQC'"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    $query2 = "INSERT INTO banque_reponse_qc (id, question, A, B, C, D, E, note) 
       SELECT reponse_qc.id, reponse_qc.question, reponse_qc.A, reponse_qc.B, reponse_qc.C, reponse_qc.D, 
        reponse_qc.E, reponse_qc.note 
       FROM reponse_qc"; 
    $stmt = $db->prepare($query2); 
    $stmt->execute(); 

    return true; 
} 

public function archiveStats() { 
    $db = $this->em->getConnection(); 
    $query = "INSERT INTO banque_statistiquecolle (id, colle_id, effectif, moyenne, mediane, note100, major, minor) 
       SELECT sc.id, sc.colle_id, sc.effectif, sc.moyenne, sc.mediane, sc.note100, sc.major, sc.minor 
       FROM statistiquecolle_groupe scg 
       LEFT JOIN statistiquecolle sc ON sc.id = scg.statistiquecolle_id 
       WHERE scg.groupe_id = 1 
       AND sc.id NOT IN (SELECT sc1.id 
           FROM statistiquecolle_groupe scg1 
           LEFT JOIN statistiquecolle sc1 ON sc1.id = scg1.statistiquecolle_id 
           WHERE scg1.groupe_id != 1)"; 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 

    $query2 = "INSERT INTO banque_statistiquequestion (id, question_id, moyenne, nbReponseTot, nbReponseA, nbReponseB, 
                 nbReponseC, nbReponseD, nbReponseE) 
       SELECT sq.id, sq.question_id, sq.moyenne, sq.nbReponseTot, sq.nbReponseA, sq.nbReponseB, sq.nbReponseC, 
       sq.nbReponseD, sq.nbReponseE 
       FROM statistiquequestion_groupe sqg 
       LEFT JOIN statistiquequestion sq ON sq.id = sqg.statistiquequestion_id 
       WHERE sqg.groupe_id = 1 
       AND sq.id NOT IN (SELECT sq1.id 
           FROM statistiquequestion_groupe sqg1 
           LEFT JOIN statistiquequestion sq1 ON sq1.id = sqg1.statistiquequestion_id 
           WHERE sqg1.groupe_id != 1)"; 
    $stmt = $db->prepare($query2); 
    $stmt->execute(); 

    $query3 = "INSERT INTO banque_repartitioncolle (id, statColle_id, note, nombre, percentOfEffectif) 
       SELECT rc.id, rc.statColle_id, rc.note, rc.nombre, rc.percentOfEffectif 
       FROM repartitioncolle rc 
       WHERE rc.statColle_id IN (SELECT bsc.id 
             FROM banque_statistiquecolle bsc)"; 
    $stmt = $db->prepare($query3); 
    $stmt->execute(); 

    $query4 = "INSERT INTO banque_repartitionquestion (id, statQuestion_id, note, nombre, percentOfEffectif) 
       SELECT rq.id, rq.statQuestion_id, rq.note, rq.nombre, rq.percentOfEffectif 
       FROM repartitionquestion rq 
       WHERE rq.statQuestion_id IN (SELECT bsq.id 
             FROM banque_statistiquequestion bsq)"; 
    $stmt = $db->prepare($query4); 
    $stmt->execute(); 

    return true; 
} 
+0

你看過物化視圖嗎? http://www.fromdual.com/mysql-materialized-views – Iceman

+0

我不認爲這會解決它。如果我理解得很好,這是加快查詢速度的一種方法。 這裏的主要問題是以一種乾淨的方式將一些具有繼承性的數據轉移到其他表中,我找不到如何去做。 –

回答

0

最近我一直在做數據庫遷移,並發現最簡單的方法(對我來說)是在SQL中做所有事情。這是一個有點費力,但它

首先放棄所有的約束

# Table1.field1 
ALTER TABLE Table1 DROP FOREIGN KEY FK_Table1_field1; 
ALTER TABLE Table1 DROP INDEX IDX_Table1_field1; 

# Table1.field2 
ALTER TABLE Table1 DROP FOREIGN KEY FK_Table1_field2; 
ALTER TABLE Table1 DROP INDEX IDX_Table1_field2; 

然後加入所有你必須將數據移動到新表的SQL工作好爲我的項目

然後刪除所有舊錶

DROP TABLE IF EXISTS Table1; 
DROP TABLE IF EXISTS Table2; 

然後添加所有的約束回

ALTER TABLE Table1 
    ADD INDEX IDX_Table1_field1 (field1 ASC); 
ALTER TABLE Table1 
    ADD CONSTRAINT FK_Table1_field1 
    FOREIGN KEY (field1) 
    REFERENCES OtherTable (xxxx) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

我不停地在它自己的SQL文件中的每一步,所以在這個例子中會有4 SQL文件,如果將數據移動步驟分成多個文件,則可能更易於管理。