[MySQL] TRIGGER i.p.v. BETWEEN

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Aangezien MySQL geen CHECK-statement ondersteunt, maar ik wel een CHECK moet uitvoeren, wilde ik dit dezelfde functionaliteit met een TRIGGER maken. Het idee is dat ieder record dat ingevoerd wordt, wordt gecontroleerd op het attribuut Leeftijd en als deze niet aan de voorwaarden voldoet de INSERT gestopt wordt. Het gaat hier om de volgende tabel:

code:
1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `kind` (
  `Kindnaam` varchar(20) NOT NULL,
  `Leeftijd` tinyint(1) NOT NULL,
  `NaamMoeder` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`Kindnaam`),
  KEY `kindFK` (`NaamMoeder`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Het attribuut Leeftijd moet tussen de 1 en 6 jaar zijn. Nu heb ik als basis elke keer de volgende code genomen:

code:
1
2
3
CREATE TRIGGER checkGetal 
BEFORE INSERT ON kind 
FOR EACH ROW *kijk of het getal van het attribuut 'Leeftijd' tussen de 1 en de 6 zit, zo niet, laat de insert niet doorgaan*;


Bij het laatste deel van de code (dat hierboven is 'weggelaten') heb ik al verschillende codes geprobeerd, maar uiteindelijk leek het erop (na via google verschillende forums geraadpleegd te hebben) dat ik het beste een attribuut dat NOT NULL is gedeclareerd de waarde NULL kan meegeven om de INSERT te stoppen. Dat probeerde ik zo:

code:
1
2
3
CREATE TRIGGER checkGetal
BEFORE INSERT ON kind 
FOR EACH ROW IF Leeftijd>6 THEN Leeftijd=NULL;


Zoals te zien, heb ik de voorwaarde al aangepast aan 'groter dan 6' om het testen wat makkelijker te maken, maar ik blijf verschillende errors krijgen. De meest voorkomende is deze:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=NULL' at line 1
Heeft iemand misschien tips, trucks of andere geintjes om me hiermee verder te helpen? Ik moet wel zeggen dat ik redelijk nieuw ben met alles wat met SQL te maken heeft, dus hopelijk kunnen jullie hier een beetje rekening mee houden.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 10:37
Een trigger lijkt me niet het meest geschikt voor input-validatie.

Kun je van je Leeftijd-veld geen ENUM-type maken met de waarden 0 t/m 6?
Of kun je dit niet filteren in de applicatie waarmee je de query opbouwt en uitvoert?

Wat betreft je laatste Trigger-statement, volgens mij hoort deze er zo uit te zien;
SQL:
1
2
3
4
5
6
7
8
CREATE TRIGGER checkGetal
BEFORE INSERT ON kind 
FOR EACH ROW 
BEGIN 
   IF NEW.Leeftijd IS NOT BETWEEN (0 AND 6) THEN 
      NEW.Leeftijd = NULL; 
   END IF; 
END

[ Voor 37% gewijzigd door frickY op 29-03-2009 12:19 ]


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Natuurlijk kan ik er een ENUM van maken, maar eigenlijk zou ik ook een oplossing willen hebben die werkt voor alle soorten 'BETWEEN'. Als ik een keer eentje moet maken voor BETWEEN 20 AND 80 lijkt het me niet voor de hand liggend om dat met een ENUM te doen.
Verder gaat het in dit geval nog om oefeningen voor een tentamen (HBO Informatica), waarbij we enkel en alleen met MySQL werken.

[Edit]

Je SQL code kreeg dit gereturned:
#1193 - Unknown system variable 'Leeftijd'
Eens kijken of ik daar wat verder mee kan komen.

[ Voor 16% gewijzigd door Devilly op 29-03-2009 12:17 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 10:37
Ik heb hem nog ietwat aangepast, zonder SET.

Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
frickY schreef op zondag 29 maart 2009 @ 12:19:
Ik heb hem nog ietwat aangepast, zonder SET.
MySQL zegt hierop:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BETWEEN (0 AND 6) THEN
NEW.Leeftijd = NULL' at line 5
Ik moet echter eerlijk zeggen dat dit mijn petje op dit moment te boven gaat, dus ik denk dat ik het voorlopig bij de ENUM houd.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die haakjes achter de BETWEEN, hangen die het zaakje niet op? Between verwacht twee waarden, en nu geef je er maar eentje door omdat elke programmeertaal spul tussen haakjes eerst uitvoert, (0 AND 6) maakt 0, dus eigenlijk staat er alleen: BETWEEN 0. Lijkt me. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Daar had ik ook al naar gekeken, maar dat lijkt het niet te zijn. Ik heb een aantal zaken veranderd om te kijken of hij dan wel zou werken, maar geen van allen had het gewenste effect. De volgende error blijft maar terugkomen:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 THEN
NEW.Leeftijd = NULL' at line 5

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 10:37
Mijn code was een kleine aanpassing op een zoekresultataat in Google op mysql conditional trigger
Wellicht dat je er zelf verder mee komt. Er zal syntactisch iets niet kloppen aan de IF.

Welke versie van MySQL gebruik je overigens?

[ Voor 15% gewijzigd door frickY op 29-03-2009 14:30 ]


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Bedankt :), ik zal ernaar kijken.

Ik gebruik MySQL 5.1.30 (uit XAMPP 1.7.0).

[ Voor 41% gewijzigd door Devilly op 29-03-2009 14:56 ]


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Moet die "IS NOT" niet gewoon "NOT" worden? :)

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
l0c4lh0st schreef op zondag 29 maart 2009 @ 16:23:
Moet die "IS NOT" niet gewoon "NOT" worden? :)
Lijkt niet te werken, maar toch bedankt voor de poging. :)

-----

Ik heb zelf nog wat gespeeld met de aangekaarte codes, maar het wil niet echt lukken.

Off-topic:De reden dat ik dit topic überhaupt opende, is dat ik morgen een toets hierover heb. Gisteren had ik dus een leraar gevraagd (degene die ook de sheets voor de les had gemaakt) hoe het moest en die zei simpelweg: 'Oh, dat is te moeilijk. Zeg dat maar tegen je leraar.' Het onderwijs is toch zo geweldig. :)
Pagina: 1