Aiuto Esercizio Sui Triggere Con Mysql Clicca QUI per vedere il messaggio nel forum |
| fra85 |
salve ragazzi,sto postando il mio esercizio così magari mi potete aiutare meglio,spero :).
Allora devo implementare un vincolo per il mio progetto.Avendo la tabella iscritto:
CREATE TABLE iscritto(
codice_fiscale VARCHAR(20) NOT NULL PRIMARY KEY,
data_di_nascita DATE ,
nome VARCHAR(20) NOT NULL,
cognome VARCHAR(20) NOT NULL,
indirizzo VARCHAR(30) NOT NULL,
costo_abbonamento DECIMAL(10,2),
numero_socio INT NOT NULL,
data_fine_abbonamento DATE,
data_inizio_abbonamento DATE
);
Dovrei implementare il vincolo che un iscritto deve avere dai 18 ai 90 anni.Uso i trigger dato che mysql ignora i chek.
Io ho provato a creare questo(anche se non ho capito bene la funzione del delimiter):
DELIMITER //
create trigger aggiorna_iscritti
after insert on iscritto
for each row
begin
declare eta int;
SET eta= YEAR(CURDATE()) - YEAR(NEW.data_di_nascita);
if eta < 18 then
if eta > 90 then
delete from iscritto where data_di_nascita= NEW.data_di_nascita;
end if;
end if;
end ;//
Mi dice che è corretto,però poi provo a inserire qualche elemento nella tabella e mi dice una cosa del genere:
mysql>INSERT ... ecc....;
-->
come se mi richiede qualcos'altro e non capisco,perchè?
Forse appunto perchè non ho capito come funziona il delimiter...
Qualcuno può aiutarmi?????
Grazie mille. |
| number15 |
Intanto io gestirei il tutto da input, cioè dal tuo programma fai che non puoi mettere età < 18 o > 90.
Per quanto riguarda il trigger, di base la struttura è questa:
code: DELIMITER $$
CREATE TRIGGER ... AFTER INSERT ON ...
FOR EACH ROW BEGIN
IF ....
END IF;
END;
$$
DELIMITER ;
Il tuo trigger sicuramente in sto punto è sbagliato:
if eta < 18 then
if eta > 90 then
son in contrasto tra di loro. Se vuoi devi ripetere la delete e chiudere l'if. ALtrimenti (più giusto) devi fare qualcosa con l'OR (eta < 18 or eta > 90).
Inoltre eviterei anche tutta la parte della dichiarazione, andando direttamente se l'anno attuale - l'anno di nascita < 18 o .... maggiore di 90.
Quando cancelli utilizza cmq la chiave (where cf = nef.cf)
Tra l'altro ti consiglio di aggiungere un id_iscritto di tipo int auto_increment da usare come PK e metti codice_fiscale come UNIQUE.
Comunque ripeto, a meno che sia espressamente richiesto, un trigger per il controllo dell'età mi pare folle. |
| fra85 |
| Si mi è stato richiesto di implementare il vincolo.OK provo a sistemarlo e vediamo |
| number15 |
Chiedi al prof comunque, per me non è giusto usare un trigger.
TI chiede vincolo a livello sql?
Perché è puoi fare vincolo applicativo e funziona uguale (anzi meglio) |
| fra85 |
Ho provato a rifarlo.Ho cancellato il vecchio trigger e ho inserito quello nuovo:
DELIMITER //
create trigger aggiorna_iscritti
after insert on iscritto
for each row begin
declare eta int;
SET eta= YEAR(CURDATE()) - YEAR(NEW.data_di_nascita);
if (eta < 18 and eta > 90) then
delete from iscritto where codice_fiscale= NEW.codice_fiscale;
end if;
end ;
//
non ho neanche il tempo di scrivere DELIMITER; infatti dopo il codice mi compare:
query ok, 0 rows affected (0.17 sec)
poi provo a farlo ora delimiter:
mysql> DELIMITER;
->
e siamo dinuovo così,come se mi richiedesse qualcosa ancora.Sono le prime volte che faccio i trigger quindi ancora so quasi niente :? |
| number15 |
if (eta < 18 and eta > 90) then
questo è sbalgiato, metti l'or.
Ma comunque parti da un trigger base.
After insert on iscritto setti un campo a scelta tua (es. nome = pippo).
E vedi se funziona. Poi vai a cambiare la struttura per quello che devi fare, ma almeno vedi come funziona. |
| fra85 |
| Siccome devo fare un'integrazione,mi richiede di implementare tre vincoli tramite check,asserzioni o trigger(c'è scritto).boh |
| number15 |
Asserzione non so cosa intenda :D.
Le check puoi metterle, poi mysql se ne frega ma tu il vincolo l'hai messo.
In postgres mi pare funzionino.
Se hai possibilità di sentire il prof, chiedi se puoi implementare il vincolo a livello applicativo.
Ovviamente poi avrai altri trigger da implementare, quindi la discussione ti è utile uguale, ma lascerei perdere questo. |
| fra85 |
| il primo l'ho implementato con il check ed è corretto,solo che mysql lo ignora :):( peggio per lui :-D:D |
|
|
|