Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Domanda teorica su foreign key

    Ciao a tutti e scusate se faccio una domanda probabilmente già trattata.
    Non ho ancora molta dimestichezza con l'SQL e nel progettare un piccolo DB di prova ho "sbattuto" sul seguente problema:
    ho 2 tabelle, nazioni e città. La prima tabella (nazioni) ha un campo 'capitale' che richiama la tabella città tramite chiave esterna.
    La seconda tabella (città) ha un campo 'nazione_di_appartenenza' che richiama a sua volta la tabella nazioni tramite chiave esterna.
    Lanciando lo script di creazione va tutto a buon fine ma ovviamente, tentando di inserire il primo record di entrambe le tabelle, l'operazione si conclude con un errore.
    Ne deduco che non sia possibile avere due tabelle che si richiamano a vicenda con 2 chiavi esterne.
    Qualcuno potrebbe confermare (o smentire) questa osservazione?
    Grazie!

  2. #2
    Probabilmente dipende dall'implementazione di SQL. Non hai specificato quale DBMS utilizzi né l'istruzione SQL che hai usato né l'errore che hai ricevuto... Tendenzialmente comunque dovrebbe essere proibito da tutti i DBMS, almeno nel caso di una dipendenza ciclica.

    Nel tuo caso, capitale dovrebbe essere un flag nella tabella città. Se vuoi assicurarti che ogni stato abbia una sola capitale, puoi mettere un indice univoco sull'id dello stato più il flag capitale.
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  3. #3
    Ti ringrazio per il chiarimento. Visto che non l'ho mai fatto ti posto il codice (MySQL) per la creazione delle due tabelle, se puoi mi indicheresti come si può mettere questo codice univoco per far si che ogni nazione abbia una sola capitale?
    Grazie

    codice:
    CREATE TABLE nations (
    id_nation INT NOT NULL AUTO_INCREMENT,
    nation_name VARCHAR(45) NOT NULL,
    continent VARCHAR(45) NOT NULL,
    population INT NOT NULL, extension INT NOT NULL,
    PRIMARY KEY (id_nation));
    
    CREATE TABLE cities (
    id_city INT NOT NULL AUTO_INCREMENT,
    city_name VARCHAR(45) NOT NULL,
    population INT NOT NULL,
    nation INT NOT NULL,
    capital BOOLEAN NOT NULL,
    PRIMARY KEY (id_city),
    FOREIGN KEY (nation) REFERENCES nations(id_nation));

  4. #4
    Ciao,

    Poiche tu vuoi che una nazione abbia una sola citta' come capitale,
    devi mettere nella tabella Nazione un campo idCittaCapitale che sara' foreign key verso la chiave primaria di citta
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  5. #5
    Grazie, ma alla fine ho risolto con un trigger così:

    codice:
    delimiter //
    CREATE TRIGGER capital_check BEFORE INSERT ON cities
    FOR EACH ROW
    BEGIN
       IF (SELECT COUNT(*) FROM cities c WHERE c.capital=1) > 0 THEN
          SIGNAL SQLSTATE '75001' set message_text = 'Attenzione, una nazione non può avere   
          due capitali!';
       END IF;
    END //

  6. #6
    controlli solo la capitale 1?
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  7. #7
    mi sembra sbagliato risolvere la cosa lato tabella città. come dice bombe, è meglio avere una colonna "capitale" nella tabella nazioni

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.