PDA

View Full Version : [MYSQL] Vincoli d'integrità


rayman2
09-06-2006, 17:05
Non riesco a capire, guardando la documentazione di MySQL 5, se si possono e come definire dei vincoli d'integrità sugli attributi del tipo:

'voto_esame' decimal(2,0) unsigned NOT NULL

in modo tale da esprimere:

CHECK 'voto_esame' > 18,
CHECK 'voto_esame' < 30

Mi sapete aiutare?
Grazie.

rayman2
10-06-2006, 08:51
spulciando la documentazione di mysql 5 ho scoperto che semplicemente non si può.

fant3
05-07-2007, 12:27
Ciao, anche io ho lo stesso problema.
Mi servirebbe CHECK per creare dei vincoli ma ho visto che non è supportato da MySQL. C'è un modo alternativo per implementarlo?

cdimauro
05-07-2007, 13:17
Passate a un engine SQL con tutti i crismi: http://www.firebirdsql.org/

MySQL i vincoli d'integrità non sa cosa siano.

Esempio: provate a dichiarare un enum('pippo', 'pluto'): intanto se mettete NOT NULL e non il default, come default vi piazza il primo elemento della lista, e poi se inserite o effettuate un update con una stringa vuota, ve la memorizza.

Lasciatelo perdere, che è meglio. Poi Firebird ha un linguaggio SQL per scrivere procedure e trigger molto potente e con una sintassi molto semplice e chiara.

fant3
05-07-2007, 16:29
Guarda puoi avere tutte le ragioni di questo mondo, ma c'è un piccolo problema...io devo fare il progetto con MySQL!

cdimauro
05-07-2007, 20:22
Devi implementarlo a livello applicativo. D'altra parte http://dev.mysql.com/doc/refman/5.0/en/create-table.html

"The CHECK clause is parsed but ignored by all storage engines."

Comunque se è un progetto per l'università potresti anche proporre Firebird come engine, evidenziando il fatto che MySQL non supporta funzionalità come questa, mentre FB lo fa perché si pone come obiettivo di essere MOLTO aderente allo standard SQL-2003.

Tra l'altro è open source come MySQL, ma non ha una doppia licenza-capestro come MySQL, ma una tipo BSD che non alcun vincolo di tipo commerciale.

axantir
06-07-2007, 11:22
Effettivamente con MySQL 5 non si possono esprimere i vincoli d'integrità con la clausola CHECK: anche io ho avuto lo stesso problema; se non si può e devi sviluppare il progetto per forza con MySQL devi aggirare il problema: immagino che sul database che stai costruendo in MySQL dovrai far girare un'applicazione, giusto? Beh, allora i controlli come

voto > 18 and voto <= 30

falli tramite l'applicazione in fase d'inserimento di una nuova tupla.
Mi spiego: quando l'utente che usa l'applicazione vuole inserire dei nuovi dati nel db prima fai i controlli che il DBMS dovrebbe effettuare tramite CHECK. Se questi sono soddisfatti, allora consenti l'inserimento dei dati, altrimenti fai fallire l'operazione con un messaggio d'errore (ad esempio).
Se non puoi fare così, devi dire al tuo prof che dovete usare un altro DBMS diverso da MySQL: ad esempio PostgreSQL credo che permetta di usare la clausola CHECK e permette di fare anche molte altre cose.

Spero d'esserti stato d'aiuto.
Ciao.

dbfabio
14-12-2008, 10:09
Ciao cdimauro.
Ho installato FireBird.
Il motivo è, appunto, perchè mysql non è in grado di far rispettare i vincoli CHECK.

A questo punto, visto che ormai sono abitutato allo sviluppo in DBDesigner 4 per database mysql, vorrei che tu mi indicassi un IDE comodo comodo per sviluppare database per FireBird.
Grazie. (Anche a chiunque voglia rispondermi..)

A presto.


Passate a un engine SQL con tutti i crismi: http://www.firebirdsql.org/

MySQL i vincoli d'integrità non sa cosa siano.

Esempio: provate a dichiarare un enum('pippo', 'pluto'): intanto se mettete NOT NULL e non il default, come default vi piazza il primo elemento della lista, e poi se inserite o effettuate un update con una stringa vuota, ve la memorizza.

Lasciatelo perdere, che è meglio. Poi Firebird ha un linguaggio SQL per scrivere procedure e trigger molto potente e con una sintassi molto semplice e chiara.

CozzaAmara
14-12-2008, 11:18
Se MySQL non supporta il vincolo di integrità la cosa più ovvia mi parrebbe quella di delegare al software la gestione di tale vincolo.

Cosa che comunque io avrei fatto a prescindere in eventuale aggiunta al CHECK del DB.

cdimauro
15-12-2008, 07:20
Ciao cdimauro.
Ho installato FireBird.
Il motivo è, appunto, perchè mysql non è in grado di far rispettare i vincoli CHECK.
Fatto benissimo. :)
A questo punto, visto che ormai sono abitutato allo sviluppo in DBDesigner 4 per database mysql, vorrei che tu mi indicassi un IDE comodo comodo per sviluppare database per FireBird.
Grazie. (Anche a chiunque voglia rispondermi..)

A presto.
Io uso IBOConsole per gestire il db, e IBUtils per generare un grafico delle relazioni del db. Mi sono trovato molto bene.
Se MySQL non supporta il vincolo di integrità la cosa più ovvia mi parrebbe quella di delegare al software la gestione di tale vincolo.

Cosa che comunque io avrei fatto a prescindere in eventuale aggiunta al CHECK del DB.
Quindi colossi come IBM con DB2, Oracle, MS con SQL Server, ecc. ecc. nonché tantissimi ricercatori nel campo del database avrebbero perso il loro tempo dietro all'implementazione server-side dei contraint: si poteva benissimo realizzare il tuo client-side...

shinya
15-12-2008, 10:47
Cosa che comunque io avrei fatto a prescindere in eventuale aggiunta al CHECK del DB.

Mah. Quindi avresti fatto lo stesso check due volte? E perchè?
La gestione dell'integrità referenziale e delle varie constraint è il motivo principe per l'esistenza di un database relazionale. E' proprio quello che deve fare, non so se mi spiego. Altrimenti basta un file di testo.

Il problema è che mysql è una schifezza immonda.

Non so se avete letto il post sul blog del creatore di mysql riguardo l'uscita della nuova versione, la 5.1.
Sostanzialmente dice che è stata rilasciata una versione affetta da bug critici e conosciuti, che possono compromettere la stabilità dei dati; ed è stata rilasciata solo per motivi di marketing, per avere qualcosa da vendere. E lo dice quello che l'ha creato, non uno che lo odia senza motivo.

http://monty-says.blogspot.com/2008/11/oops-we-did-it-again-mysql-51-released.html

Leggete pure, c'è da rimanere a bocca aperta. Per l'amor di dio, abbandonate MySQL quanto prima!

nucce
15-12-2008, 11:01
scusate l'ignoranza ma non sarebbe possibile implementarlo con delle regole attive (trigger)?

cdimauro
15-12-2008, 13:09
Per l'amor di dio, abbandonate MySQL quanto prima!
*
scusate l'ignoranza ma non sarebbe possibile implementarlo con delle regole attive (trigger)?
Certo, se fosse possibile sollevare eccezioni con MySQL, ma... si sono "dimenticati" di implementare l'istruzione SIGNAL (o RAISE o EXCEPTION che dir si voglia) per farlo!

Ebbene sì: con la versione 5.0 hanno introdotto trigger e stored procedure, ma NON la possibilità di sollevare eccezioni. Cosa che non è stata introdotta neppure con la 5.1, nonostante da ben TRE ANNI sia stato aperto un ticket nel loro bug system e da un annetto circa sia disponibile una patch, ma... per la sola 6.0 alpha (di un backport per la 5.1 e/o la 5.0 non se ne parla proprio).

Attualmente per aggirare il problema bisogna RICORRERE A UNA PEZZA, come ad esempio richiamare una stored procedure che non esiste, oppure inserire un record in una tabella con un valore inconsistente (es: inserire due volte lo stesso valore su un campo unique).