Check MySql

di Anonimizzato7960 il
7 risposte
Ciao a tutti, vi spiego velocemente il problema. Devo fare un progetto per la gestione di uno stadio, in cui c'è la possibilità di acquistare abbonamenti e biglietti. Sia i biglietti che gli abbonamenti sono relativi ad un posto. Ho qiundi le tabelle:
[*] Posto(Numero)
[*] Biglietto (Codice, Posto), con posto foreign key references Posto (numero)
[*] Abbonamento (Codice, Posto), con posto foreign key references Posto (numero)

Ovviamente un posto non può essere relativo sia ad un biglietto che ad un abbonamento, per cui pensavo di inserire nella tabella biglietto qualcosa come: "posto int(10) check (posto not in (select (posto) from abbonamento)".

Ho, però, letto che la clausola check viene praticamente ignorata in mysql, quindi come posso fare?

7 Risposte

  • Ciao Della,

    Da quello che mi ricordo non è solo mysql ad ignorarla...

    Hai provato con i trigger?
  • Ciao, grazie per la risposta!
    Con i trigger non ho provato sinceramente, però per quanto ne so (ben poco purtroppo) i trigger sono operazioni scatenate in seguito a determinati eventi (ad esempio l'inserimento di una nuova tupla) e non è possibile utilizzare i trigger per fare in modo che una tupla venga inserita solo se soddisfa una certa condizione..o sbaglio?
  • Ciao Della,

    infatti bisognerebbe fare un lavoro sporco o trucchi per aggirare la mancanza di eccezioni o segnali... effettivamente poco relazionale.

    Se i tracciati Biglietto/Abbonamento fossero simili potresti fonderli aggiungendo un header identificatore... quello che si sarebbe fatto un volta.

    Io non ho mai creduto troppo nelle relazioni anche per le differenze che esistono tra db.

    Detto questo, ti lascio con un augurio di una soluzione pulita da vincoli.

    ~Max
  • Ciao max,
    effettivamente cercando sul web ho trovato delle soluzioni, ma si tratta, come dici tu, di lavori sporchi (es chiamare una funzione non definita).
    Personalmente trovo abbastanza grave la mancanza di vincoli di check e soprattutto di asserzioni.
    Il problema, comunque, l'ho risolto in maniera differente. Infatti, visto che uno dei requisiti del progetto era quello di creare una pagina PHP per interagire con il DB, ho fatto in modo che venissero mostrati solo i posti effettivamente liberi.
    Ti ringrazio comunque per gli auguri e per avermi risposto
  • Puoi usare un trigger o una vista.

    Per il trigger, vedi la mia risposta qui: https://www.iprogrammatori.it/forum-programmazione/mysql/cancellare-riga-appena-inserita-con-trigger-t15791.html
    Non è affatto sporca, è un uso normalissimo dell'istruzione SIGNAL.

    Per la vista:

    CREATE VIEW xxx AS (SELECT * FROM tab WHERE posto not in (select (posto) from abbonamento)) WITH CHECK OPTION;

    Una vista del genere, su una sola tabella, è scrivibile. Cioè tu puoi fare una INSERT sulla vista, e la riga verrà inserita nella tabella. Ma grazie alla clausola WITH CHECK OPTION, la riga verrà rifiutata se non corrisponde alla clausola WHERE.
  • Ti ringrazio per la risposta, alla fine il problema l'ho risolto da php, facendo in modo di visualizzare solo i dati "giusti". Terrò conto comunque della tua soluzione se mai mi si dovesse ripresentare un problema simile
  • Facendolo in SQL avresti avuto la certezza di inserire solo dati corretti
Devi accedere o registrarti per scrivere nel forum
7 risposte