promotion image of download ymail app
Promoted
Anonimo
Anonimo ha chiesto in Computer e InternetProgrammazione e Design · 8 anni fa

Chiavi esterne MySQL?

Salve a tutti, sto creando un database con MySQL. Ho due entità B e C, le quali possiedono una chiave esterna ciascuna che puntano alla chiave primaria dell'entità A. Il problema è che riesco a collegare solo una delle due entità (o B o C) ad A, mentre per l'altra mi da errore. Idee?

Aggiornamento:

Mi avete detto che non ho fornito abbastanza dettagli quindi aggiungo:

-Le entità B e C possiedono entrambe un ID (di tipo int) e una chiave esterna (di tipo int anch'essa);

-L'entità A possiede solo un ID (di tipo int);

-Non ci sono altre entità all'interno del DB;

-Sto usando il DB creato di default all'installazione del programma;

-Utilizzo MySQL Workbench 5.2 CE.

Non so cos'altro aggiungere, chiedetemi pure altri chiarimenti.

1 risposta

Classificazione
  • 8 anni fa
    Risposta preferita

    I motivi possono essere veramente tanti ma con le informazioni che dai è impossibile aiutarti.

    Mi scuso per la risposta un po' in ritardo, cmq.:

    1) Le tabelle sono tutte INNODB ? (credo di si ma ti assicuro che può sfuggire)

    2) sulle chiavi esterne come gestisci eventuali valori NULL, che poi non dovrebbero esserci (anche se ammesso)

    PROVA COSI':

    CREATE TABLE IF NOT EXISTS `a` (

    `ID` int(11) NOT NULL,

    PRIMARY KEY (`ID`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE IF NOT EXISTS `b` (

    `ID` int(11) NOT NULL,

    `FKEY` int(11) NOT NULL,

    PRIMARY KEY (`ID`),

    KEY `FKEY` (`FKEY`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE IF NOT EXISTS `c` (

    `ID` int(11) NOT NULL,

    `FKEY` int(11) NOT NULL,

    PRIMARY KEY (`ID`),

    KEY `FKEY` (`FKEY`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    Fino a qui ho ricreato la tua struttura ora altero le table per inserire i vincoli di integrità referenziale.

    ALTER TABLE `b`

    ADD CONSTRAINT `b_ibfk_1` FOREIGN KEY (`FKEY`) REFERENCES `a` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE;

    Ho collegato la tabella B alla tabella A ed ho impostato "la gestione degli eventi" di delete e update su cascade quindi se cancelli una tupla in A cancelli automaticamente anche in B e C.

    ALTER TABLE `c`

    ADD CONSTRAINT `c_ibfk_1` FOREIGN KEY (`FKEY`) REFERENCES `a` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE;

    Come sopra ma relativo alla tabella b.

    Per caso usi l'autoincrement da qualche parte? (il mio dubbio è sulle foreign key)

    IL codice che ti ho postato funziona è il dump del DB su cui l'ho testato.

    MySQL Workbench è un bel software ma ogni tanto complica un po' troppo la traduzione da ER a SQL se vuoi un consiglio fai a mano la traduzione.

    • Commenter avatarAccedi per rispondere alle risposte
Altre domande? Fai una domanda e ottieni le risposte che cerchi.