PDA

View Full Version : [MySQL] "Sicronizzare" due tabelle tramite il campo di relazione


robertino_salemi
17-02-2016, 15:15
Ciao a tutti voi.

Ho la necessita di "sincronizzare" due tabelle:

ESEMPLARI
id, etc....

EXPO
id, id_esemplari

Diciamo che:
- ESEMPLARI e' la tabella madre con "id" chiave primaria
- EXPO e' in relazione con la tabella ESEMPLARI tramite la colonna id_esemplari

Io vorrei che tutti gli id di ESEMPLARI siano contenuti in id_esemplari di EXPO.

Al momento invece ho una situazione anomala:
1) non tutti gli id di ESEMPLARI sono contenuti in id_esemplari di EXPO
2) su EXPO sono presenti id_esemplari che non trovano una corrispondenza in EXPO.

Come potrei riallineare il tutto?

Grazie.

robertino_salemi
18-02-2016, 15:41
Non capisco la tua affermazione.

DoctorT
18-02-2016, 15:54
penso di aver capito quello che vorresti fare, tecnicamente "sincronizzare" significa creare un vincolo di integrità referenziale tra 2 tabelle del database.

in MySQL questo si fà inserendo una FOREIGN KEY al momento della creazione della tabella ... ti posto questo esempio preso paro para da W3schools spero sia comprensibile:



CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)



in pratica poi dovresti gestire anche gli errori del DBMS che si generano quando tenti di cancellare e/o modificare una FOREIGN KEY

robertino_salemi
21-02-2016, 00:21
Alla fine ho risolto tramite queste due query:


-- Ho rimosso le righe contenenti gli ID_ESEMPLARI non presenti nella tabella ESEMPLARI
DELETE FROM expo_westie
WHERE NOT EXISTS(SELECT NULL
FROM esemplari f
WHERE f.id = id_esemplari)

-- Ho inserito gli ID della tabella ESEMPLARI non presenti nella tabella EXPO_WESTIE
INSERT INTO expo_westie (id_esemplari)
SELECT id
FROM esemplari
WHERE id NOT IN (
SELECT id_esemplari
FROM expo_westie
)


Magari sarebbe meglio usare una foreign key, vero?

DoctorT
21-02-2016, 18:53
Alla fine ho risolto tramite queste due query:

...
Magari sarebbe meglio usare una foreign key, vero?

dipende, intanto bisogna vedere se nella relazione logica tra le 2 tabelle questa integrità deve essere mantenuta e per fare questo dovremmo conoscere il modello che hai voluto rappresentare nel tuo database.

Inoltre la tua soluzione potrebbe generare un programma che funziona correttamente ma è meno "robusto" cioè è più facile che quando viene modificato generi errori.

In ogni caso direi che è bene imparare ad usare le FOREGN KEY e a capire quando bisogna inserirle nelle nostre tabelle.

Hellzakk
23-02-2016, 10:17
quoto DoctorT, mi piacerebbe capire a cosa ti serve questa relazione

robertino_salemi
23-02-2016, 11:14
quoto DoctorT, mi piacerebbe capire a cosa ti serve questa relazione

In che senso?

Hellzakk
23-02-2016, 11:17
a cosa ti serve avere una tabella con riferimenti alle primary key di una sulle primary key di un'altra

robertino_salemi
23-02-2016, 11:19
La connessione non e[ tra due PRIMARY KEY.

Io devo relazionare
ESEMPLARI > id (PRIMARY KEY)

EXPO > id_esemplari (NO PRIMARY KEY)

Hellzakk
23-02-2016, 11:32
mi sono spiegato male, su EXPO avrai una sua primary key con il campo id_esemplari che certamente non è primary key ma che deve avere lo stesso valore della primary key di ESEMPLARI... ho capito bene?

se si non ho capito a cosa ti può servire...

robertino_salemi
23-02-2016, 13:15
Esatto, giusto!

robertino_salemi
23-02-2016, 16:32
Devo capire come usarle, fino ad oggi non ne ho mai fatto uso.

robertino_salemi
23-02-2016, 22:41
Auto ditatta....

Hellzakk
24-02-2016, 07:18
Scusa se ripeto per l'ennesima volta la stessa domanda, ma qualè lo scopo di avere 2 tebelle così composte?

Non lo chiedo per farmi gli affari tuoi, ma per capire se ci può essere un metodo migliore.

robertino_salemi
24-02-2016, 11:04
Scusa se ripeto per l'ennesima volta la stessa domanda, ma qualè lo scopo di avere 2 tebelle così composte?

Non lo chiedo per farmi gli affari tuoi, ma per capire se ci può essere un metodo migliore.

Inizialmente e' nata la tabella ESEMPLARI con PRIMARY KEY id

Successivamente per tali esemplari e' nata l'esigenza di inserire dei risultati nelle Esposizioni con diverse informazioni.
Cosi' e' stata creata la tabella EXPO con PRIMA KEY id e messe in relazione con la tabella ESEMPLARI tramite la colonna id_esemplari.


Allora mi sa che ti mancano proprio delle nozioni base.
Fermo restando che questi argomenti richiedono tanto studio teorico, il non sapere cosa siano e come si rispettino i vincoli referenziali denota lacune da colmare il prima possibile.

Dovrei approfondire molto l'argomento.
Alcuni consigli in merito? Tutorial da linkarmi?

Grazie.

Hellzakk
24-02-2016, 12:16
Inizialmente e' nata la tabella ESEMPLARI con PRIMARY KEY id

Successivamente per tali esemplari e' nata l'esigenza di inserire dei risultati nelle Esposizioni con diverse informazioni.
Cosi' e' stata creata la tabella EXPO con PRIMA KEY id e messe in relazione con la tabella ESEMPLARI tramite la colonna id_esemplari.

Quindi nella tabella EXPO non sarà presente solamente id ed id_esemplari ma anche altri attributi e giustamente non hai scelto di aggiungere altri campi alla tabella ESEMPLARI perchè hai più esposizioni per ogni esemplare, giusto?

robertino_salemi
24-02-2016, 12:59
Esatto, all'inizio avrei dovuto avere piu' esposizioni, dopo invece la corrispondenza tra le due tabelle e diventata di
1 a 1.

Hellzakk
24-02-2016, 16:54
Se e' 1 a 1 non ti conviene alterare la tabella ESEMPLARI aggiungendo gli attributi che ti servono?

Presumo che le esportazioni le leggi ogni volta che leggi esemplari, raddoppiando il costo di lettura inutilmente..

robertino_salemi
24-02-2016, 17:14
Eh lo so, ma si tratta di un progetto alquanto vecchio, tutto e' cambiato in corso d'opera e quindi....

Ne faro' tesoro per la prossima volta.