Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di coteaz
    Registrato dal
    Mar 2006
    Messaggi
    365

    [MYSQL] foreign key problemi e consigli

    Salve sto avendo dei problemi con le chiavi esterne, usando la funzione ON UPDATE.

    premetto una domanda... MA UNA CHIAVE ESTERNA VIENE MESSA SU UNA TABELLA PADRE O SU UNA TABELLA FIGLIO?

    io credo su una figlio; cmq ecco un po di codice

    codice:
    CREATE TABLE IF NOT EXISTS `tipologia_fornitore` (
      `TIPOLOGIA_FORNITORE_id` bigint(10) NOT NULL auto_increment,
      `TIPOLOGIA_FORNITORE_nome` varchar(100) NOT NULL,
      `TIPOLOGIA_FORNITORE_active` enum('si','no') NOT NULL default 'si',
      PRIMARY KEY  (`TIPOLOGIA_FORNITORE_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
    
    CREATE TABLE IF NOT EXISTS `fornitore` (
      `FORNITORE_id` bigint(10) NOT NULL auto_increment,
      `FORNITORE_nome` varchar(100) NOT NULL,
      `FORNITORE_indirizzo` varchar(100) NOT NULL,
      `FORNITORE_telefono` varchar(100) NOT NULL,
      `TIPOLOGIA_FORNITORE_id` bigint(10) NOT NULL,
      `FORNITORE_active` enum('si','no') NOT NULL default 'si',
      PRIMARY KEY  (`FORNITORE_id`),
      KEY `TIPOLOGIA_FORNITORE_id` (`TIPOLOGIA_FORNITORE_id`,`FORNITORE_active`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
    quindi tipologia_fornitore è la tabella padre mentre fornitore è la tabella figlio.

    la chiave in "relazione" è TIPOLOGIA_FORNITORE_id

    nel mio database effettuo cancellazioni logiche per questo ho il campo active, quindi se CANCELLO un record dalla tabella tipologia_fornitore (EFFETTUANDO UN UPDATE LDEL CAMPO ACTIVE = no) tutti i campi active della tabella fornitore verranno impostati su no dove TIPOLOGIA_FORNITORE_id = TIPOLOGIA_FORNITORE_id

    sono stato chiaro?

    e fino a qui tutto ok, o almeno sembra funzionare.

    il mio problema è questo... se voglio CANCELLARE un fornitore (QUINDI SEMPRE AGGIORNANDO IL CAMPO ACTIVE) la chiave esterna si incazza

    codice:
     UPDATE fornitore SET `FORNITORE_active` = 'no' WHERE FORNITORE_id =3
    
    #1452 - Cannot add or update a child row: a foreign key constraint fails
    (`intranet/fornitore`, CONSTRAINT `fornitore_fk` FOREIGN KEY
    (`TIPOLOGIA_FORNITORE_id`, `FORNITORE_active`) REFERENCES `tipologia_fornitore`
    (`TIPOLOGIA_FORNITORE_id`, `TIPOLOGIA_FORNITORE_active)
    credo che sia giusto che la chiave esterna si comporti così, ma come posso risolvere il mio problema? se voglio settare active su no in una tabella figlia?

    la cosa che mi fa riflettere è questa... se invece di impostare una chiave di questo tipo, metto in relazione solo i campi TIPOLOGIA_FORNITORE_id on update no action, on delete cascade succede che io riesco a cancellare FISICAMENTE i campi da una tabella figlio senza che la chiave esterna si incazzi, ma a me non serve questo

    spero di essere stato chiaro e non ripetitivo, aspetto vostri consigli

    grazie

    ps, devo mettermi un po a studiare sql :master:

  2. #2
    Utente di HTML.it L'avatar di coteaz
    Registrato dal
    Mar 2006
    Messaggi
    365
    in realtà è giusto che SQL si comporti così xkè garantisce l'integrità relazionale tra padre e figlio!

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.