Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194

    [MySql] Errore su creazione tabella con chiave importata.

    codice:
    CREATE TABLE `privato` (
      `p_ID` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`p_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `cv`
    -- 
    
    CREATE TABLE `cv` (
      `cv_candidato` int(11) NOT NULL,
      `cv_nome` varchar(30) collate utf8_unicode_ci NOT NULL,
      PRIMARY KEY  (`cv_candidato`,`cv_nome`),
      FOREIGN KEY (`cv_candidato`) REFERENCES `privato` (`p_ID`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `datorelavoro`
    -- 
    
    CREATE TABLE `datorelavoro` (
      `dat_ID` int(11) NOT NULL,
      `dat_privato` int(11) NOT NULL,
      PRIMARY KEY  (`dat_privato`,`dat_ID`),
      FOREIGN KEY (`dat_privato`) REFERENCES `privato` (`p_ID`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `esperienza`
    -- 
    
    CREATE TABLE `esperienza` (
      `e_datainizio` date NOT NULL,
      `e_cvowner` int(11) NOT NULL,
      `e_cvnome` varchar(30) NOT NULL,
      `e_datoreid` int(11) NOT NULL,
      `e_privato` int(11) NOT NULL,
      PRIMARY KEY  (`e_datainizio`,`e_cvowner`,`e_cvnome`),
      FOREIGN KEY (`e_cvowner`,`e_cvnome`) REFERENCES `cv` (`cv_candidato`,`cv_nome`) ON DELETE CASCADE ON UPDATE CASCADE,
      FOREIGN KEY (`e_datoreid`,`e_privato`) REFERENCES `datorelavoro` (`dat_ID`,`dat_privato`) ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    Salve, sto cercando di creare questo piccolo db, ma durante la creazione della tabella esperienza ottengo il seguente errore:
    #1005 - Can't create table '.\db_prova\esperienza.frm' (errno: 150)
    Togliendo la foreign key su `e_datoreid`,`e_privato` non ho più errori, ma io ho bisogna di crearla!! Non riesco proprio a capire perchè non posso creare una semplice chiave importata.
    Grazie a tutti per l'aiuto.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  2. #2
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Up.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  3. #3
    devi usare la primary key come l'hai impostata....

    PRIMARY KEY (`dat_privato`,`dat_ID`),

    ma poi usi:

    REFERENCES `datorelavoro` (`dat_ID`,`dat_privato`)

    gira la chiave primaria di *datorelavoro*

    PRIMARY KEY (`dat_ID`, `dat_privato`),

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Ti ringrazio ho risolto invertendo le chiavi sulla clausola references.

    "There is no dark side of the moon really. Matter of fact it’s all dark."

  5. #5
    Originariamente inviato da sky_451
    Ti ringrazio ho risolto invertendo le chiavi sulla clausola references.

    avrei preferito invertire le voci della chiave primaria come ti avevo indicato. era piu' lineare con la foreign key della tabella "esperienza" ...


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    codice:
    CREATE TABLE `privato` (
      `p_ID` int(11) NOT NULL auto_increment,
      PRIMARY KEY  (`p_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `cv`
    -- 
    
    CREATE TABLE `cv` (
      `cv_candidato` int(11) NOT NULL,
      `cv_nome` varchar(30) collate utf8_unicode_ci NOT NULL,
      PRIMARY KEY  (`cv_candidato`,`cv_nome`),
      FOREIGN KEY (`cv_candidato`) REFERENCES `privato` (`p_ID`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `datorelavoro`
    -- 
    
    CREATE TABLE `datorelavoro` (
      `dat_ID` int(11) NOT NULL,
      `dat_privato` int(11) NOT NULL,
      PRIMARY KEY  (`dat_ID`,`dat_privato`),
      FOREIGN KEY (`dat_privato`) REFERENCES `privato` (`p_ID`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `esperienza`
    -- 
    
    CREATE TABLE `esperienza` (
      `e_datainizio` date NOT NULL,
      `e_cvowner` int(11) NOT NULL,
      `e_cvnome` varchar(30) NOT NULL,
      `e_datoreid` int(11) NOT NULL,
      PRIMARY KEY  (`e_datainizio`,`e_cvowner`,`e_cvnome`),
      FOREIGN KEY (`e_cvowner`,`e_cvnome`) REFERENCES `cv` (`cv_candidato`,`cv_nome`) ON DELETE CASCADE ON UPDATE CASCADE,
      FOREIGN KEY (`e_datoreid`,`e_cvowner`) REFERENCES `datorelavoro` (`dat_ID`,`dat_privato`) ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- --------------------------------------------------------
    Ho ricambiato come hai detto tu.
    In più ho modificato una foreign key in esperienza.
    Ora però ho un altro problema: se eseguo una REPLACE su una tupla di datorelavoro e ho una tupla di esperienza che è in relazione con tale datore ottengo il seguente errore:
    codice:
    Cannot delete or update a parent row: a foreign key constraint fails (`lavora/esperienza`, CONSTRAINT
    
     `esperienza_ibfk_2` FOREIGN KEY (`e_datoreid`, `e_cvowner`) REFERENCES `datorelavoro` (`dat_ID`, `dat_privato
    
    `))
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  7. #7
    replace esegue un delete seguito da un insert.... penso si tratti del comando REPLACE

    meglio se dai una attenta lettura a tutte le eccezioni e vincoli che hanno le foreign keys

    http://dev.mysql.com/doc/refman/5.0/...nstraints.html

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    MMM... Infatti ho pensato anch'io che può essere un problema della REPLACE. Ora provo a leggermi la documentazione che hai inserito e vedo se riesco a capire qualcosa.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  9. #9
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Penso di aver capito che il problema sta proprio nel modo di lavorare della REPLACE che prima elimina e poi inserisce. Tutto nasce dalla foreign key di esperienza:
    codice:
    FOREIGN KEY (`e_datoreid`,`e_cvowner`) REFERENCES `datorelavoro` (`dat_ID`,`dat_privato`) ON UPDATE CASCADE
    Quando cerco di fare una replace su datore lavoro l'innoDb engine non me lo permette perchè c'è una tupla figlia referente su esperienza. Ora che so l'inghippo spero di poter trovare una soluzione al mio senza dover rinunciare alla REPLACE che mi è mooolto comoda.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.