Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2017
    Messaggi
    12

    Tabelle referenziate a vincenda e inserimento valori

    Salve voglio gestire due tabelle:
    1) officina con nome,via,nr, città, cap, ndip e dirigente;
    2) Dipendenti con cf,via,nr,città,cap, officina.

    dove il campo dirigente è legato al campo cf di dipendenti, ed il campo officina di dipendenti è legato al campo nome di officina, ho creto

    codice:
    create table if not exists Dipendente (
    CF varchar (16) primary key,
    via varchar (25) not null,
    nciv varchar (5) default 0,
    citta varchar (15) not null,
    cap varchar (5) not null,
    officina varchar (45)
    );
    codice:
    create table if not exists Officina (
    nome varchar (45) primary key,
    via varchar (25) not null,
    nciv varchar (5) default 0,
    citta varchar (15) not null,
    cap varchar (5) not null,
    ndip numeric (3) default 1,
    dirigente varchar (16),
    foreign key (dirigente)
    references Dipendente (CF)
    );
    codice:
    Alter table Dipendente
    add constraint officina foreign key (officina) references Officina(nome);

    Ora le tabelle sono vuote, naturalmente se provo ad inserire un dipendete o un'officina mi viene ritornato

    Operation failed: There was an error while applying the SQL script to the database.
    ERROR 1452: 1452: Cannot add or update a child row: a foreign key constraint fails (`officine`.`officina`, CONSTRAINT `officina_ibfk_1` FOREIGN KEY (`dirigente`) REFERENCES `dipendente` (`CF`))
    SQL Statement:
    INSERT INTO `officine`.`officina` (`nome`, `via`, `nciv`, `citta`, `cap`, `ndip`, `dirigente`) VALUES ('Officina1', 'p', '2', 'roma', '00010', '1', 'X')

    Per risolvere tale problema è quindi necessario introdurre una terza tabella intermedia che leghi officina e dipendente? oppure esiste qualche altra soluzione?

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da avouni Visualizza il messaggio
    ....... Per risolvere tale problema è quindi necessario introdurre una terza tabella intermedia che leghi officina e dipendente? oppure esiste qualche altra soluzione?
    è ambiguo ......
    sembrerebbe una relazione Molti a Molti che presuppone obbligatoriamente l'utilizzo di una terza tabella



    La ambiguità nasce dal significato dei nomi che hai dato ai campi e tabelle

    - Tabella "Dipendenti" con PrimaryKey il campo "CF"
    - Tabella "Officina" con ForeignKey campo "Dirigente" referenziato sul CF della tabella "Dipendenti"

    Quindi ti chiedo ogni officina ha 1 solo Dirigente oppure puo avere più dirigenti ?????

    dalla risposta che ci darai dipenderà la risposta che ti daremo

    .

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2017
    Messaggi
    12
    Quote Originariamente inviata da nman Visualizza il messaggio
    è ambiguo ......
    sembrerebbe una relazione Molti a Molti che presuppone obbligatoriamente l'utilizzo di una terza tabella



    La ambiguità nasce dal significato dei nomi che hai dato ai campi e tabelle

    - Tabella "Dipendenti" con PrimaryKey il campo "CF"
    - Tabella "Officina" con ForeignKey campo "Dirigente" referenziato sul CF della tabella "Dipendenti"

    Quindi ti chiedo ogni officina ha 1 solo Dirigente oppure puo avere più dirigenti ?????

    dalla risposta che ci darai dipenderà la risposta che ti daremo

    .
    Ciao grazie per la risposta, ogni officina ha 1 e 1 solo dirigente.

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da avouni Visualizza il messaggio
    Ciao grazie per la risposta, ogni officina ha 1 e 1 solo dirigente.
    Allora diventa una classica e semplice relazione "Uno a Molti" dove ogni "Officina" pesca il suo unico "Dirigente" nella tabella dei "Dipendenti" al campo "CF"


    in pratica devi eliminare nel tuo codice il "Alter Table" che hai messo in fondo e poi tutto dovrebbe sistemarsi
    nel senso che
    - innanzitutto popoli la tabella "Dipendenti"
    - poi popoli la tabella "Officina"

    .

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2017
    Messaggi
    12
    Quote Originariamente inviata da nman Visualizza il messaggio
    Allora diventa una classica e semplice relazione "Uno a Molti" dove ogni "Officina" pesca il suo unico "Dirigente" nella tabella dei "Dipendenti" al campo "CF"


    in pratica devi eliminare nel tuo codice il "Alter Table" che hai messo in fondo e poi tutto dovrebbe sistemarsi
    nel senso che
    - innanzitutto popoli la tabella "Dipendenti"
    - poi popoli la tabella "Officina"

    .
    Ma in questo modo in dipendenti poprei aggiungere una persone con un'officina che non esiste non esiste referenziazione.
    Avrei pensato a questa soluzione:


    codice:
    create table if not exists Officina (
        nome varchar (45) primary key,
        via varchar (25) not null,
        nciv varchar (5) default 0,
        citta varchar (15) not null,
        cap varchar (5) not null,
        ndip numeric (3) default 1
    
    );
    
    
    create table if not exists Dipendente (
        CF varchar (16) primary key,
        via varchar (25) not null,
        nciv varchar (5) default 0,
        citta varchar (15) not null,
        cap varchar (5) not null,
        officina varchar (45),
        foreign key (Officina) references Officina (nome)
    
    );
    
    create table if not exists direzione (
        officina varchar (45),
        dipendente varchar (16),
        primary key (officina, dipendente),
        foreign key (officina) references Officina (nome),
        foreign key (dipendente) references Dipendente (cf)
    );
    Sembra funzionare, ma volevo sapere se esisteva qualche soluzione alternativa, magari migliore.

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da avouni Visualizza il messaggio
    .......... poprei aggiungere una persone con un'officina che non esiste non esiste referenziazione.
    ............
    volevo sapere se esisteva qualche soluzione alternativa, magari migliore.
    quindi ti serve una relazione 1 a 1


    La tua soluzione la ho guardata 30 secondi adesso devo andare pertanto ti do solo la prima impressione:
    "mi sembra confusa, ---> Troppe relazioni"


    Prova a leggerti questo che ho trovato a caso su Google
    Tieni presente che l'autore (Andrea Montanari) è un maestro
    https://social.technet.microsoft.com...um=sqlserverit

    .

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2017
    Messaggi
    12
    Quote Originariamente inviata da nman Visualizza il messaggio
    quindi ti serve una relazione 1 a 1


    La tua soluzione la ho guardata 30 secondi adesso devo andare pertanto ti do solo la prima impressione:
    "mi sembra confusa, ---> Troppe relazioni"


    Prova a leggerti questo che ho trovato a caso su Google
    Tieni presente che l'autore (Andrea Montanari) è un maestro
    https://social.technet.microsoft.com...um=sqlserverit

    .
    In teoria con quello script posso creare un customer senza creare i dettagli...(mettendomi nell'esempio proposto servirebbe creare customers e i suoi dettagli obbligatoriamente).

    Nel mio caso creare una nuova relazione è una forzatura (e lo so), ma in questo modo garantisco che non potrò avere un dirigente (dipendente) che dirige un'officina inesistente. Potrei caricare anche prima (eliminando i vingoli) le officine e poi i dirigenti, e poi inserire nuovamente i vincoli con alter, ma ad ogni nuova officina dovrei fare questa operazione.

  8. #8
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da avouni Visualizza il messaggio
    Ma in questo modo in dipendenti poprei aggiungere una persone con un'officina che non esiste non esiste referenziazione.
    Avrei pensato a questa soluzione:
    ........
    Mi stai "sconfondendo"

    Tu hai:
    - delle Officine
    - dei Dirigenti
    Vuoi che ogni officina abbia un solo dirigente
    Vuoi che ogni dirigente abbia una sola officina
    Non vuoi avere Dirigenti senza officina
    Non vuoi avere officine senza dirigenti


    In pratica è una relazione 1 a 1 ma con la aggiunta delle condizioni che ho scritto sopra in rosso.

    ho provato a costruire le tabelle con lo script che ci proponi al post #5 e poi sono riuscito a:
    lasciando la tabella "direzione" vuota
    Inserito Officine a volontà
    Inserito Dipendenti a volontà senza compilare il campo "Dipendente.officina"

    Quindi ho dei dubbi sulla funzionalita di quanto proposto ...........

    --------------------------------------------------------------

    In effetti (a livelli ideale) ti basterebbe una sola tabella in assoluto
    dove registri su record unico e contemporaneamente
    - la officina con tutti i suoi campi (indice univoco sul nome officina)
    - il dipendente con tutti i suoi campi (indice univoco sul CF dipendente)

    ma questa soluzione (anche se funzionale) non mi piace assolutamente
    perché ti costringe a registrare entita diverse su una unica tabella

    -----------------------------------------------------------


    Vediamo al prossimo post come la farei io se avessi lo stesso problema

    .

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da nman Visualizza il messaggio
    ...... Vediamo al prossimo post come la farei io se avessi lo stesso problema ......
    ho ancora qualche dubbio ma io lo farei come da immagine con
    - direzione.dirId - Primary Key autoincrementale
    - Officina.OffId - Primary Key autoincrementale
    - Dipendente.DipId - Primary Key autoincrementale

    - direzione.officina - Indice Univoco
    - direzione.dipendente - Indice Univoco
    - Officina.nome - Indice Univoco
    - Dipendente.CF - Indice Univoco



    ---------------------------


    PS: anche se "fuori tema" ricordati che in italia il CF non è assolutamente univoco
    fai una ricerca su Google "omocodia"
    ( ma non si vergognano i nostri boriosi amministratori ????????? )

    per generare 60.000.000 di codici univoci sarebbe capace anche la mia piccolina

    invece i nostri cari amministratori ci creano il CF per risolvere il pronbema
    dei nomi e cognomi duplicati e fanno i codici duplicati
    In questo momento sto provando un sentimento che si chiama disprezzo

    Fine della parentesi politica, mi scusino i moderatori
    Immagini allegate Immagini allegate
    Ultima modifica di nman; 05-01-2017 a 09:18

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.