PDA

View Full Version : [MySQL] Problema con una foreign key


Alhazred
24-01-2011, 23:19
Creo due tabelle in questo modo

create table localita (
nome varchar(255) PRIMARY KEY
);
INSERT INTO localita VALUES ('Roma');
INSERT INTO localita VALUES ('Milano');
INSERT INTO localita VALUES ('Venezia');

create table zone (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nome varchar(255),
localita varchar(255)
);
ALTER TABLE zone ADD CONSTRAINT FK_zone FOREIGN KEY (localita) REFERENCES localita(nome) ON UPDATE CASCADE;
INSERT INTO zone (nome,localita) VALUES ('Testaccio','Roma');
INSERT INTO zone (nome,localita) VALUES ('Trastevere','Roma');
INSERT INTO zone (nome,localita) VALUES ('EUR','Roma');
INSERT INTO zone (nome,localita) VALUES ('Fiera','Milano');

Se ora modifico la tabella "localita" cambiando ad esempio "Roma" in "Roma (RM)" con una query UPDATE, il nome della località cambia, ma sulla tabella "zone" non c'è effetto, benché sia impostato un "ON UPDATE CASCADE".

Altra anomalia è che se modifico il campo "localita" della tabella "zone" con un nome non presente nella tabella "localita", il db me lo lascia fare tranquillamente.
In pratica è come se non avessi impostato la foreign key.

Cosa mi sfugge?

dojolab
25-01-2011, 06:19
Cosa mi sfugge?

Una feature fondamentale di MySQL: non supporta l'integrità referenziale (a meno che tu non usi InnoDB o un altro Storage Engine) :cool: .

Alhazred
25-01-2011, 11:32
:doh: ho dimenticato l'engine...

Grazie.

dojolab
25-01-2011, 11:42
:doh: ho dimenticato l'engine...

Grazie.

De nada ;)

Alhazred
25-01-2011, 17:03
Altro problema, questa foreign key non mi da errore, come mai?

create table sottocategorie (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
categoria varchar(255),
nome varchar(255),
descrizione text,
KEY (categoria,nome)
) ENGINE=InnoDB;

create table appartamenti (
codice varchar(20) PRIMARY KEY,
categoria varchar(255) NOT NULL,
sottocategoria varchar(255) NOT NULL,
localita varchar(255),
zona varchar(255)
) ENGINE=InnoDB;

ALTER TABLE appartamenti ADD CONSTRAINT FK_app_sub FOREIGN KEY (sottocategoria) REFERENCES sottocategorie(nome) ON UPDATE CASCADE;

Cosa mi sono dimenticato questa volta?

dojolab
25-01-2011, 20:23
Cosa mi sono dimenticato questa volta?

InnoDB supporta l'integrità referenziale? No lo chiedo perché sono rimasto indietro su quel ce... emh di Engine :).

Strano che MySQL non ti dia ne warning ne errori, ha un sistema di debug cosi sofisticato (ovviamente è ironico).

:cool:

Il problema è analogo al precedente?