View Full Version : [MySql] Come modificare una tabella per aggiungergli un references ad un'altra?
D4rkAng3l
20-05-2009, 15:30
Ciao,
ho due tabelle fatte nel seguente modo:
mysql> describe citta;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Citta | varchar(35) | YES | | NULL | |
| Cap | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
mysql> describe utente;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| User_Id | varchar(20) | NO | PRI | NULL | |
| Nome | varchar(20) | NO | | NULL | |
| Cognome | varchar(20) | NO | | NULL | |
| Data_Nascita | date | NO | | NULL | |
| Indirizzo | varchar(50) | NO | | NULL | |
| Cap | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
Praticamente devo fare in modo che il campo Cap dela tabella utente prenda il campo Cap della tabella citta come foreign key....devo modificare tale tabella con alter table, ho provato a fare così ma non mi funziona:
ALTER TABLE utente ADD CONSTRAINT CapDeveEsistere FOREIGN KEY (Cap) REFERENCES citta (Cap);
come mai? Cosa sbaglio?
Tnx
Andrea
D4rkAng3l
20-05-2009, 16:31
Altra domanda:
Domanda 2, se ho una tabella come questa:
mysql> describe comuni;
+------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| comune | varchar(255) | YES | | NULL | |
| provincia | varchar(255) | YES | | NULL | |
| cap | varchar(255) | YES | | NULL | |
| prefisso_tel | varchar(255) | YES | | NULL | |
| codice_istat | varchar(255) | YES | | NULL | |
| codice_catastale | varchar(255) | YES | | NULL | |
| sito_comune | varchar(255) | YES | | NULL | |
+------------------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
e la tabella è gia popolata di dati c'è modo di cambiargli il tipo del campo cap da varchar ad int e convertire tutti i dati contenuti nella colonna cap da varchar ad int?
Ciao,
ho due tabelle fatte nel seguente modo:
...
come mai? Cosa sbaglio?
Tnx
Andrea
Prova ad aggiungere il constraint di foreign key direttamente nello statement di creazione della tabella
, CONSTRAINT `nomeconstraint' FOREIGN KEY (cap)
REFERENCES citta(cap)
Occhio alla virgola inziale
Inoltre sappi che MySql puo' montare diversi Engine, alcuni dei quali NON supportano le foreign key, anche largamente usati per soluzioni commerciali.
E questo secondo me la dice lunga sulla serieta' di MySql.
Spera di non avere montato uno di questi engine sfortunati.
Altra domanda:
Non conosco bene MySql, ma su quasi tutti i motori lo statement e'
ALTER TABLE citta MODIFY COLUMN cap INT(11)
Ancora una cosa, ovviamente per poter indicare una foreign key i campi delle 2 tabelle devono essere dello stesso tipo
D4rkAng3l
21-05-2009, 12:40
Prova ad aggiungere il constraint di foreign key direttamente nello statement di creazione della tabella
, CONSTRAINT `nomeconstraint' FOREIGN KEY (cap)
REFERENCES citta(cap)
Occhio alla virgola inziale
Inoltre sappi che MySql puo' montare diversi Engine, alcuni dei quali NON supportano le foreign key, anche largamente usati per soluzioni commerciali.
E questo secondo me la dice lunga sulla serieta' di MySql.
Spera di non avere montato uno di questi engine sfortunati.
mmm perchè la virgola iniziale? cmq avevo provato una formulazione del genere ma non mi funzionava...vabbè alla fine ho optato per mantenere il campo Cap a varchar (e ricreare la tabella utente con tale tipo nel relativo campo cap) perchè riflettendo ho pensato che i cap in genere sono del tipo: "00100" e se lo tenesi come int non potrei mettere i 2 valori 0 iniziali...quindi sta bene così.
Altra domanda da un milione di dollari...praticamente una parte di questo esame funziona così:
Prendo il vecchio progetto fatto al primo esame di Database, lo popolo di dati (tanti dati) e vedo quanto ci mette a fare le varie query.
Poi si ottimizzano le query usando le view ed inserendo degli indici....si rieseguono le stesse query e si mostra il risultato dell'ottimizzazione mostrando che le query ottimizzate ed il database con degli indici ci mettono meno tempo rispetto a prima.
Piccolo dettaglio...per ora ho popolato solo la tabella comuni, province, regioni (con tutti i dati relativi ad esempio ai comuni italiani: nome comune, cap del comune, numero abitanti, etcetc...ovviamente queste tabelle le ho trovate prefatte su Internet...sarebbe stato impossibile inserire dati coerenti a mano in poco tempo).
Poi ho usato un programma chiamato Data Generator for MySql ed ho riempito la tabella utenti (per ora solo questa) con circa 6000 utenti (il programma è fatto molto bene ed è fatto per rispettare i vincoli di integrità referenziale popolando la tabella utente e mettendo nel relativo campo Cap un valore pescato dal campo Cap della tabella Comuni).
Vabbè tutto sto discorso per dire: ho popolato con parecchi record la tabella utenti....anche le tabelle comuni, province non sono piccolissime in quanto contengono tutti i comuni e le province italiane...bene se provo a fare delle query (non complesse ma comunque con 2-3 join) ci mette sempre pochissimo ad eseguirle (tipo al più 0,3 secondi).
Ora...vabbè che devo popolare anche tutto il resto del db ma mi sembra troppo basso come tempo e sopratutto così non saprei come far vedere la differenza tra query prima e dopo l'ottimizzazione del db e delle query stesse :muro: :muro: :muro: :muro:
Può essere che è attivata una cache delle query e che ci mette così poco per questo motivo? In MySql eventualmente è possibile disattivare tale cache?
Cmq ovviamente ho usato InnoDB che m garantisce le foreign key e mi dovrebbe anche gestire in automatico le transazioni...MyIsam sarà più prestazionale ma per tale progetto sarebbe solo scomodo...
Grazie
Andrea
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.