CHECK CONSTRAINTs werden ignoriert

thomy800

Erfahrenes Mitglied
Hallo,
der Titel sagt eigentlich schon alles. Ich verwende MySQL auf Windows.
Das Problem ist, dass ich Checks gebastelt habe, die scheinbar völlig ignoriert werden. Auf http://dev.mysql.com/doc/refman/5.1/de/create-table.html steht folgendes:
... Zudem wird die Klausel CHECK von allen Speicher-Engines erkannt, aber ignoriert.
Nun die Frage: wie kann ich dennoch Constrains verwenden? Geht das mit MySQL gar nicht? Bzw kann man irgend ein Update/Patch installieren, dass es geht? Kann man nur mit Hilfe von Triggern (löschen falls ungültig) das Problem umgehen?

Grüße
Thomy

PS: eigenartigerweise funktionieren jedoch foreign key und not null....
 
MySQL kann keine check constraints. Der SQL-Syntax dafür ist wies scheint nur für den fall vorhanden, dass es später irgendwann eingebaut wird.

foreign key und not null sind keine check constraints.

mit nem trigger könnte man es eventuell lösen, allerdings hängt es davon a was du genau vor hast.
Warschienlich reicht es aus den NEW datensatz so zu modifizieren, dass der insert aufgrund eines NULL checks fehlschlägt. Wäre zu testen ob das geht.
Wichtig ist, dass du potentiell 2 trigger brauchst.... before insert und before update.

Und beachte dabei bitte, dass trigger nicht feuern wenn es sich um ne modifkation aufgrund eines foreign keys handelt.
 
hey, danke schon mal für die Antwort.

Meiner Meinung nach sind foreign key und not null auch eine art check constraints, da "gecheckt" wird, ob der Wert null bzw. der key gültig ist.

Also bei mir soll das hier umgesetzt werden; das ist ein kleines Spiel mit Armeen:
SQL:
create table IF NOT EXISTS armee (
	soldatid int unsigned not null,
	c int not null check (c<= 50 AND c>= 0),
	userid int unsigned not null,
	locx int not null,
	locy int not null,
	primary key(soldatid,userid,locx,locy),
	FOREIGN key(soldatid) REFERENCES soldat (id) ON DELETE cascade,
	FOREIGN key(userid) REFERENCES users (id) ON DELETE cascade
);

alter table armee
	add constraint countcheck check ( NOT EXISTS (
		select  locx, locy
		from armee
		group by  locx,locy
		having sum(c) > 50)
	);
Es soll sicher gestellt werden, dass an einer Position (x,y) nicht mehr als 50 Mann stehn.

Wie sollte dazu die Trigger-Variante aussehen?

Grüße
Thomy
 
Zurück