PDA

View Full Version : [SQL] problema con foreign key....chi mi da una manina?


thefrog
30-06-2005, 17:25
stò preparando un esame su sql

devo creare queste 2 tabelle ma non ho capito bene come funzionano ste foreign key e infatti mi da quest'errore:

Error | 1005 | Can't create table '.\cddb\artist.frm' (errno: 150)

il codice è questo:
CREATE TABLE Artist
(artistid INT(10) UNSIGNED AUTO_INCREMENT NOT NULL,
name CHAR (255) NOT NULL,
index (artistid, name),
FOREIGN KEY (artistid, name) REFERENCES CD(artist,name), # ON UPDATE CASCADE,
countryid CHAR (3) NOT NULL,
website CHAR (255),
description TEXT,
PRIMARY KEY (artistid)) ENGINE=INNODB;
show warnings;
INSERT INTO Artist(artistid,name,countryid,website,description) VALUES (NULL, 'The Chemical Brothers', 'UK', 'http://www.thechemicalbrothers.com', 'blablablablablabla');
INSERT INTO Artist(artistid,name,countryid,website,description) VALUES (NULL, 'Moby', 'USA', 'http://www.moby.com', 'blabla');
INSERT INTO Artist(artistid,name,countryid,website,description) VALUES (NULL, 'Skin', 'UK', 'http://www.skinmusic.net', 'blablabla');

show warnings;
CREATE TABLE CD (
cdid int(10) UNSIGNED AUTO_INCREMENT NOT NULL,
artist int(10) UNSIGNED NOT NULL,
name CHAR (255) NOT NULL,
index (artist,name),
FOREIGN KEY (artist, name) REFERENCES Artist(artistid, name),
title char(255) NOT NULL,
label char(255) NOT NULL,
released date NOT NULL,
PRIMARY KEY (cdid)) ENGINE=INNODB;

INSERT INTO CD (artist,name,title,label,released) VALUES (NULL, 'The Chemical Brothers', 'Push the button', 'EMI', '2005-01-24');

qualcuno mi spiega cosa sbaglio con ste foreign key? su mysql.com non sono riuscito a capirlo :|

grazie mille

Brazorv
30-06-2005, 17:30
FOREIGN KEY (artistid, name) REFERENCES CD(artist,name) ON UPDATE CASCADE,

forse così?

thefrog
30-06-2005, 17:35
FOREIGN KEY (artistid, name) REFERENCES CD(artist,name) ON UPDATE CASCADE,

forse così?

uhm...quello l'avevo commentato io, non c'entra nulla, mi ero scordato di toglierlo prima di postare sul forum :D

Brazorv
30-06-2005, 17:37
già # :D forse è il caldo

Brazorv
30-06-2005, 17:41
cmq quella riga eliminala non serve

Brazorv
30-06-2005, 18:04
quando crei la tabella artista fai riferimento alla tabella cd che non è ancora stata creata, per cui mysql ti da quell'errore.
se vuoi legare la tabella cd ad artista, devi fare riferimento da cd ad artista, e non il contrario.

thefrog
30-06-2005, 18:34
l'ho levata e avevi ragione, ora da solo un errore, questo:

ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails

Brazorv
30-06-2005, 18:45
nell'ultima riga quando inserisci i valori del cd non devi mettere NULL come artist id ma il valore esatto dell'id corrispondente nella tabella artist.
Un'altra cosa che ho notato ora è che in cd tu referenzi l'artista con artistid e name, puoi usare solo artistid perchè è la chiave di artist.
Prova così, io non ho un server mysql ora.

thefrog
30-06-2005, 19:18
nell'ultima riga quando inserisci i valori del cd non devi mettere NULL come artist id ma il valore esatto dell'id corrispondente nella tabella artist.
Un'altra cosa che ho notato ora è che in cd tu referenzi l'artista con artistid e name, puoi usare solo artistid perchè è la chiave di artist.
Prova così, io non ho un server mysql ora.

ma io vorrei che gli artist della tabella CD e artisti fossero automaticamente in realzione.....non so se si vede ma non ho tanto chiara sta cosa...:D

vorrei evitare chw quando uno inserisce un record nella tabella CD si debba "ricordare a memoria" l'ID dell'artista.

si può fare? cioè...sicuramente si ma forse sbaglio qualcosa concettualemente io

Brazorv
30-06-2005, 19:52
ma io vorrei che gli artist della tabella CD e artisti fossero automaticamente in realzione.....non so se si vede ma non ho tanto chiara sta cosa...:D

vorrei evitare chw quando uno inserisce un record nella tabella CD si debba "ricordare a memoria" l'ID dell'artista.

si può fare? cioè...sicuramente si ma forse sbaglio qualcosa concettualemente io

Quello che vuoi fare tu si può fare a livello di applicativo.
Per esempio quando tu crei una pagina web (con php,asp,jsp...) per inserire i dati del cd, metti dei textfield per inserire i dati relativi al cd, poi metti un <select> per l'inserimento dell'artista. Fai una query così
SELECT artistid,name FROM artist;
fai visualizzare name nella lista e assegni artistid come value e prendi questo come valora per fare poi la insert nel database.