|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[MySQL] vincoli ON DELETE XXX e ON UPDATE XXX
sto usando seriamente MySQL per la prima volta, e mi trovo di fronte alla seguente difficoltà. mettiamo che io eseguo le seguenti istruzioni:
Codice:
CREATE DATABASE test; USE test; CREATE TABLE parent ( lol BOOLEAN NOT NULL PRIMARY KEY /* nome e tipo scelti a caso, tanto per avere una chiave primaria */ ); CREATE TABLE child ( asd BOOLEAN NOT NULL REFERENCES parent(lol) ON DELETE CASCADE ON UPDATE CASCADE ); ![]() se faccio questo: Codice:
DELETE FROM parent WHERE lol="true"; Ultima modifica di 71104 : 03-09-2008 alle 22:42. |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
altra cosa: la clausola REFERENCES non dovrebbe fare in modo che mi venga vietato di inserire una entry in child se per quel campo non esiste un valore corrispondente in parent?
praticamente facendo questo: Codice:
INSERT INTO child VALUES(TRUE); c'è decisamente qualcosa che non sto capendo... 'sti vincoli non funzionano come mi pare di aver capito che debbano funzionare: le entries sembrano completamente scorrelate. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ti sei appena scontrato con una delle cazzate più grosse di MySQL: l'integrità referenziale ce l'hai (nel senso che funziona; il parsing viene effettuato per qualunque engine, per cui in questo momento tu stai vivendo nell'illusione di aver creato una struttura coerente e che sulla carta dovrebbe funzionare; solo sulla carta però: MySQL mica t'informa che poi, di fatto, non funzionerà
![]() Nel tuo caso, non avendolo specificato, di default viene usato MyISAM, che ovviamente NON la supporta. Io uso InnoDB come engine per farla funzionare. Modifica le tabelle in questo modo: Codice:
CREATE TABLE parent ( lol BOOLEAN NOT NULL PRIMARY KEY /* nome e tipo scelti a caso, tanto per avere una chiave primaria */ ) engine=InnoDB; CREATE TABLE child ( asd BOOLEAN NOT NULL REFERENCES parent(lol) ON DELETE CASCADE ON UPDATE CASCADE ) engine=InnoDB; MySQL meriterebbe una pagina ad hoc su YourLanguageSucks. ![]() Se poi vuoi usare un engine SQL degno di questo nome, puoi sempre provare FireBird. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Che io sappia le tabelle su MySQL, a meno che non sia una versione vecchia, vengono create come InnoDB.
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
l'avevo letta infatti questa storia di InnoDB sulla documentazione, ma mi pareva che valesse solo per l'istruzione FOREIGN KEY. comunque ho provato or ora con "engine=InnoDB" e non cambia nulla: "INSERT INTO" inserisce in child anche se il valore non è presente in parent, e "DELETE FROM parent" di cancellare a cascata non ci pensa neanche.
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Fosse Oracle ti potrei aiutare un pò di più. Con MySQL l'unica cosa che posso fare è dirti di dare un'occhiata qui:
http://dev.mysql.com/doc/refman/5.0/...nstraints.html ...e di usare InnoDB, che è l'unico motore che si avvicina ad un database relazionale. Però per favore, non usare un boolean come PK. Nemmeno per prova. Ogni volta che qualcuno usa un boolean come PK, Gesù Bambino piange, lo sai vero?
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#7 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB; ![]() credo di non aver capito io qualcosa, ma mi piacerebbe tanto capirla sta cosa. Quote:
![]() |
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
__________________
Khelidan |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non sono io che decido quale database usare; io devo solo scrivere un programma Java che lo usa (si tratta della mia tesi
![]() ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7240
|
qui c'è scritto che così come hai fatto te non ha alcun effetto e serve solo come promemoria
http://dev.mysql.com/doc/refman/6.0/...eign-keys.html |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ammazza che schifo
![]() grazie k0nt3 ![]() PS: altro che YourLanguageSucks... |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7240
|
guarda per l'integrità referenziale non c'è paragone con postgreSQL
![]() |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Vero. Ho fatto la prova con la 5.0 e crea tabelle InnoDB. Con la 4.x che io ricordi le creava con MyISAM.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:08.