Pagina 1 di 1
MySql problema Alter - FOREIGN KEY
Inviato: lunedì 24 gennaio 2011, 23:44
da generalekamikaze
Salve ragazzi, ho un grosso problema con un database(si tratta di un esercizio per un esame!).
Bene. Il concetto è semplice. Devo infatti modificare una tabella pre-esistente e non vuota(motore=Innodb)aggiungendo un vincolo referenziale con chiave esterna verso una tabella da me creata.
allora, la tabella creata da me è questa (alla quale la seconda fa riferimento):
Codice: Seleziona tutto
CREATE TABLE Filiali(
Nro_filiale CHAR(1) PRIMARY KEY,
Nome_filiale CHAR(20),
Sede_filiale CHAR(20),
Nro_dipendenti INTEGER
)TYPE=INNODB;
La tabella che ospite, che ha bisogno di referenziare la prima è questa:
Codice: Seleziona tutto
CREATE TABLE Scorte(
Codice_libro CHAR(4) REFERENCES Libri(Codice_libro),
Nro_filiale CHAR(1),
Nro_copie_disponibili DECIMAL(1,0) DEFAULT 0,
Data_controllo DATE,
PRIMARY KEY(Codice_libro, Nro_filiale)
) TYPE=INNODB;
Bene...
Io dò questo comando:
Codice: Seleziona tutto
ALTER TABLE Scorte ADD CONSTRAINT FOREIGN KEY (Nro_filiale) REFERENCES Filiali(Nro_filiale);
Questa è la risposta di MySql:
Codice: Seleziona tutto
ERROR 1005 (HY000): Can't create table 'HenrysBooksDB090202_1.#sql-59f_2a' (errno: 150)
Ho letto parecchio in giro. qualcuno dice che dovrebbero essere dei problemi di accesso, ma così non è. Infatti sono root e se così fosse non riuscirei neppure a creare la tabella.
Bene. Non so che pesi pigliare...Illuminatemi!!
Re: MySql problema Alter - FOREIGN KEY
Inviato: martedì 25 gennaio 2011, 8:35
da garak
devi avere un index sulla colonna a cui aggiungi la chiave esterna
Re: MySql problema Alter - FOREIGN KEY
Inviato: martedì 25 gennaio 2011, 12:17
da generalekamikaze
Ehm..:Scusa l'ignoranza, che intendi per index???
Re: MySql problema Alter - FOREIGN KEY
Inviato: mercoledì 26 gennaio 2011, 9:24
da garak
generalekamikaze ha scritto:
Ehm..:Scusa l'ignoranza, che intendi per index???
temo che tu abbia un problema più grosso per il tuo esame, se non sai cos'è un index...
http://dev.mysql.com/doc/refman/5.1/en/ ... index.html
Re: MySql problema Alter - FOREIGN KEY
Inviato: giovedì 27 gennaio 2011, 21:05
da generalekamikaze
Prenditela con la professoressa, gli indici non fanno parte del programma.
Comunque non dovrebbe essre questo il problema, infatti la guida dice :
Normally, you create all indexes on a table at the time the table itself is created with CREATE TABLE
Quindi l'index esiste già.
Domani controllo nello specifico la base di dati, perché dopo queste ne ho create parecchie, tutte effettuando la stesso operazione correttamente!
Ti farò sapere!
Tra l'altro l'index è opzionale:
ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
Re: MySql problema Alter - FOREIGN KEY
Inviato: venerdì 28 gennaio 2011, 10:17
da Ptah
Io ho provato ad eseguire le stesse query che hai scritto e non ho avuto problemi...
Quello che ti dice il server è che non puoi creare la tabella blablabla...sicuro di essere root quando tenti di creare la chiave?
Non è che per caso non hai i permessi di alter? Prova ad eseguire questa
Codice: Seleziona tutto
ALTER TABLE `Scorte` CHANGE `Nro_copie_disponibili` `Nro_copie_disponibili` TINYINT( 1 ) UNSIGNED NULL DEFAULT '0'
Se ti da ancora errore allora l'utente non ha permessi di "alter"...
A parte questo...perchè le due chiavi primarie sono varchar?

Le chiavi primarie, nella norma, sono interi (mediumint o int) perchè è molto più veloce cercare con numeri che con lettere...
Re: MySql problema Alter - FOREIGN KEY
Inviato: domenica 30 gennaio 2011, 11:57
da garak
generalekamikaze ha scritto:
Comunque non dovrebbe essre questo il problema, infatti la guida dice :
Normally, you create all indexes on a table at the time the table itself is created with CREATE TABLE
Quindi l'index esiste già.
Hai problemi anche con l'inglese: la guida ti dice che normalmente gli indici si creano al momento della creazione della tabella. Non ti sta dicendo che si creano da soli, ti sta dicendo che di solito uno li crea contestualmente alla tabella (ma può anche crearli dopo).
Comunque, la documentazione relativa all'aggiunta di indici è questa:
http://dev.mysql.com/doc/refman/5.1/en/ ... index.html
Se vuoi un consiglio su come imparare mysql più facilmente: usa phpMyAdmin (è nel repository): ha un'interfaccia grafica e dopo ogni comando eseguito ti mostra la sua sintassi.
Re: MySql problema Alter - FOREIGN KEY
Inviato: domenica 30 gennaio 2011, 11:59
da garak
Ptah ha scritto:
A parte questo...perchè le due chiavi primarie sono varchar?

Le chiavi primarie, nella norma, sono interi (mediumint o int) perchè è molto più veloce cercare con numeri che con lettere...
Non è vero, un indice su un campo CHAR ha la stessa velocità di un intero.
Su un VARCHAR invece no, ma non è questo il caso.
Re: MySql problema Alter - FOREIGN KEY
Inviato: domenica 30 gennaio 2011, 13:22
da generalekamikaze
Seguirò il consiglio Gerak, ma solo dopo l'esame.
Per ora devo fare le cose nel modo in cui me le hanno fatte vedere (dire al Professore, solo ciò che vuole davvero sapere!).
Comunque Gerak, ti assicuro che ne ho fatte ormai una decina di queste alterazioni senza l'utilizzo di indici, so che magari, detto da qualcuno che ha appena iniziato, può sembrarti "strano", non ti chiedo di prendertela, ma di crederci! Sicuro come dici tu è un modo sbagliato, ma funziona!
Ptah appena provo ti faccio sapere! Per quanto riguarda la chiave (oltre a ciò che ti ha risposto garak) il concetto è che stò manipolando tabelle pre-create,non sono io che ho progettato la base di dati!
Dato che ci siete, vorrei farvi una domandina stupidina... Devo creare una Vista di nome TipiLibro@HenrysDowntown (non chiedetemi di cambiargli nome, DEVO chiamarla così!) ma ho un problema proprio nell'utilizzo del carattere "@"!
CREATE VIEW TipiLibro_HenrysDowntown AS SELECT DISTINCT l.Tipo_libro FROM Libri l,Scorte s,Filiali f WHERE l.Codice_libro = s.Codice_libro AND s.Nro_filiale = f.Nro_filiale AND Nome_filiale = 'Henrys Downtown';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''TipiLibro@HenrysDowntown' AS SELECT DISTINCT l.Tipo_libro FROM Libri l,Scorte s' at line 1
Edit: Garet, ma per indici si intendono le chiavi???