2010-03-29 9 views
29

Ich habe eine Tabelle mit einer URL und einer Zeichenfolge, die ihre Parameter darstellt. Das Problem ist, dass ich will, dass eine URL und ein Parameterstring die eindeutige Einschränkung für die Tabelle bilden - auch dürfen keine Einträge die gleiche URL UND Parameter-Zeichenfolge haben. Die Parameter-Zeichenfolge kann eine beliebige Länge haben (länger als 800 Bytes oder so, was die maximale Länge für einen MySql-Schlüssel ist, daher kann ich Unique (URL, Params) nicht verwenden, da es einen Fehler auslöst ...).Wie INSERT-Operation in MySql-Trigger abgebrochen werden?

Ich dachte über die Verwendung von Triggern, dies zu tun, aber wie kann ich eine Ausnahme auslösen/einen Fehler auslösen, wenn der Auslöser entdeckt, dass die Einfügung ist im Begriff, einen doppelten Eintrag einzufügen? Ich stelle mir vor, ich möchte eine MySqlException wie MySql mit doppelten Primärschlüssel usw. geworfen haben, so dass ich es in meinem C# -Code abfangen kann.

Ich habe zwei Stücke im Auslöser Ich brauche Hilfe mit: ... Abbrechen Wurf Ausnahme zu C# ... Wie ich eine Ausnahme usw. zu C# werfen? ... Erlaube einfügen ... - Wie erlaube ich einfach die Einfügung, wenn es keinen doppelten Eintrag gibt?

Heres der Trigger-Code:

CREATE TRIGGER urls_check_duplicates 
BEFORE INSERT ON urls 
FOR EACH ROW 

BEGIN 
DECLARE num_rows INTEGER; 

SELECT COUNT(*) 
INTO num_rows 
FROM urls 
WHERE url = NEW.url AND params = NEW.params; 

IF num_rows > 0 THEN 
    ... ABORT/throw exception to C# ... 
ELSE 
    ... Allow insert ... 
END 
+0

von MySQL 5.5, möglicherweise früher, Sie Signale verwenden können, [siehe meine Antwort hier] [1] [1]: http://stackoverflow.com/questions/24/throw-error- in-mysql-trigger/7189396 # 7189396 – RuiDC

Antwort

6

Wenn Ihre Tabellendefinition für einen NOT NULL-Wert ist, könnten Sie NEW auf NULL setzen, was die Einfügung praktisch nicht ermöglicht. Möglicherweise müssen Sie den strikten SQL-Modus aktivieren, damit dies ordnungsgemäß funktioniert.

67

Ich bin darauf gestoßen und obwohl die Lösung funktioniert, bin ich später auf das gekommen, was sich für mich wie eine bessere Lösung anfühlt. Ich vermute, dass dies keine Option war, als diese Frage ursprünglich beantwortet wurde.

CREATE TRIGGER `TestTable_SomeTrigger` 
BEFORE UPDATE ON `test_table` 
FOR EACH ROW 
BEGIN 
    DECLARE msg VARCHAR(255); 
    IF (SomeTestToFail = "FAIL!") THEN 
     set msg = "DIE: You broke the rules... I will now Smite you, hold still..."; 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg; 
    END IF; 

    -- Do any other code here you may want to occur if it's all OK or leave blank it will be 
    -- skipped if the above if is true 
END$$ 

Dies wird jetzt eine nette (oder böse!) Fehlermeldung zurückgeben, die Sie fangen können. Für weitere Informationen hierzu siehe: http://dev.mysql.com/doc/refman/5.5/en/signal.html

Ich hoffe, das hilft jemand anderem!

+2

Das ist wirklich erstaunlich. Arbeitete für mich. – rishad2m8

+1

Danke. Ich musste einen Tisch haben und nicht überlappende Bereiche erzwingen und dies ermöglichte es mir, dies zu tun. – Kickstart

+1

Dies sollte die akzeptierte Antwort sein ... UP VOTE! – smashing

Verwandte Themen