Check MySql

di il
7 risposte

Check MySql

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

  • Re: Check MySql

    Ciao Della,

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

    Hai provato con i trigger?
  • Re: Check MySql

    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?
  • Re: Check MySql

    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
  • Re: Check MySql

    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
  • Re: Check MySql

    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.
  • Re: Check MySql

    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
  • Re: Check MySql

    Facendolo in SQL avresti avuto la certezza di inserire solo dati corretti
Devi accedere o registrarti per scrivere nel forum
7 risposte