Bedingte UNIQUE Constraint?
- Dieses Thema hat 4 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 16 Jahre, 1 Monat von
Anonym.
-
AuthorPosts
-
24. Juli 2007 um 9:57 Uhr #2788
AnonymInaktivIst es möglich eine UNIQUE Constraint auf eine Tabelle zu setzen, die nur unter bestimmten Bedingungen greift?
Da ich mit "Löschflags" arbeite (also in meiner Tabelle ein Feld deleted heisst) würde ich gerne die Datensätze, die als gelöscht gekennzeichnet sind, aus der Integritätsbedingung herausnehmen.Ich dachte da an soetwas wie eine CHECK Constraint in der Form von:
CONSTRAINT unique_check CHECK (UNIQUE(field_1) OR deleted = 1)
Aber bei CHECK Constraints ist diese Syntax ja nicht zulässig…  :-/
25. Juli 2007 um 7:17 Uhr #3175
AnonymInaktivHi KleinerMaulwurf,
ich würde statt CHECK (was nicht möglich ist) über einen Trigger nachdenken. Darin läßt sich ein SELECT auf den möglichen doppelten Zeilenwert unterbringen und die Operation ggfs. abbrechen.
MfG
H.A. Pürner
25. Juli 2007 um 7:29 Uhr #3432
AnonymInaktivHallo  🙂
Über einen Trigger habe ich auch schon nachgedacht. – Aber, wie sieht’s dann mit der INSERT-Geschwindigkeit aus? Das Problem ist nämlich, dass ich eine sehr hohe Datenlast habe und diese in "vernünftiger" Zeit bewältigen muss.
26. Juli 2007 um 20:43 Uhr #3593
AnonymInaktivHi KleinerMaulwurf,
natürlich kostet ein Trigger etwas Zeit, Checks oder UNIQUE auch! Also testen, ob es noch ausreicht oder nicht – was anderes kann ich nicht raten.
Eine andere Möglichkeit wäre, in den als gelöscht gekennzeichneten Zeilen den entsprechenden Wert auf NULL zu setzen und einen Unique-Index ohne NULLs zu definieren – wenn es die Anwendung hergibt.
Mfg
AxelP
31. Juli 2007 um 9:41 Uhr #3713
AnonymInaktivSo, werde nen Trigger nutzen. Habe dazu allerdings gleich die nächste Frage.
Mein INSERT-Trigger hat folgenden Aufbau:
CREATE TRIGGER <trigger-name>
  BEFORE INSERT ON <tabelle>
  REFERENCING NEW AS new_record
  FOR EACH ROW
  MODE DB2SQL
  WHEN (...)
  BEGIN ATOMIC
    SIGNAL SQLSTATE '70001' ('<Fehlermeldung>');
  ENDDas funktioniert wunderbar. – Allerdings würde ich gerne einen bestehenden SQLSTATE-Wert zurückgeben (23513 [The resulting row of the INSERT or UPDATE does not conform to the check constraint definition])
Das klappt dann aber nicht. RAISE_ERROR funktioniert übrigens auch nicht.
Kann man nur selbst definierte SQLSTATE-Werte (also über 70000) zurückgeben?
-
AuthorPosts
You must be logged in to reply to this topic.