![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Zeos
Unique bei 4 verschiedenen Feldern
Ohh
Mir fällt keine guter Titel ein sorry. Ich habe vier Felder
Delphi-Quellcode:
und möchte das die Datenbank die vier Felder
ZTable1ORDER1 : TLargeintField;
ZTable1ORDER2 : TLargeintField; ZTable1ORDER3 : TLargeintField; ZTable1ORDER4 : TLargeintField; auf Unique überprüft. Also ob der eingegebene Wert schon vorhanden ist. Also wenn ich ZTable1ORDER1.Value = 5 und ZTable1ORDER3.Value = 5 das die Datenbank dann meckert. Ist das verständlich, was ich möchte ?:pale: |
AW: Unique bei 4 verschiedenen Feldern
NOrmalerweise hätte ich geschrieben, nimm einen Unique Constraint. Aber der gilt über alle Felder, einzelne Werte dürfen dabei sehr wohl identisch sein, nicht aber die Kombination aller Werte.
Welche Wertebereiche gibt es denn hier, Du könntest mit expliziten Constraints arbeiten, die Feldgleichheit verbieten. Kommt mir aber etwas murxig vor. Hast Du die Möglichkeit einen Insert/Update Trigger anzulegen, der diese Prüfung vornimmt? Grundsätzlich ist das Anliegen ungewöhnlich, bist Du sicher, dass Dein Datenmodell ok ist? Um's nochkurz zu schreiben, diese denormalisierten Spalten mit den 4 Orders sind nicht schön. Das wäre besser eine Liste mit Orders, dann hättest Du kein Problem, weder jetzt noch wenn mal "Order5", 6 oder 7 hinzukommt. Dazu müsste man dann weder die DB noch das Programm groß umbauen. |
AW: Unique bei 4 verschiedenen Feldern
Da würde sich doch ein Trigger auf der Datenbank anbieten.
Einfach mal Tante Google fragen -> ![]() |
AW: Unique bei 4 verschiedenen Feldern
Geht sowas im Firebird nicht?
SQL-Code:
Oder kann dieser Constraint nur jeweils ein Feld behandeln? (konnte ich auf die Schnelle nicht aus der Doku erkennen)
CREATE TABLE irgendwas (
ZTable1Order1 INTEGER, ZTable1Order2 INTEGER, ZTable1Order3 INTEGER, ZTable1Order4 INTEGER, .. CONSTRAINT uk_ZTable1Order UNIQUE (ZTable1Order1, ZTable1Order2, ZTable1Order3, ZTable1Order4) ) Im Prostgress mußte ich es aber auch mal so lösen, weil ich auch das NULL unique haben wollte.
SQL-Code:
CONSTRAINT uk_ZTable1Order UNIQUE (COALESCE(ZTable1Order1, ''), COALESCE(ZTable1Order2, ''), COALESCE(ZTable1Order3, ''))
[edit] ich mein natürlich mit einer 0, oder einem anderem nichtgenutzen Wert anstatt dem '' |
AW: Unique bei 4 verschiedenen Feldern
Zitat:
Weiß nicht ob FB das kann. Weiß auch nicht, ob es das Problem des TE beseitigt. |
AW: Unique bei 4 verschiedenen Feldern
Hab die beiden Zeilen in der mitte mal ausgetauscht. (die Frage zuerst und dann den Text zum Code darunter auch nach da unten).
War wohl etwas verwirrend so (hatte beim Umkopieren wohl nicht richtig aufgepasst) Aso, ich glaub jetzt hab ich das verstanden. Es sind 4 Felder und ein Wert "Integer" darf nur einmal vorkommen, egal in welchem Feld. Oder meinst du daß ein Wert pro Zeile nur einmal vorkommen darf? Bei mir dufte nur eine "Gruppe" aus 4 Integer einmal vorkommen. Hmmm, dann bleibt wohl wirklich nur der Trigger. > in allen vier Feldern prüfen, ob der Wert nirgendwo vorkommt, abgesehn von dem Feld, was grade geprüft wird. |
AW: Unique bei 4 verschiedenen Feldern
Wenn ich es richtig verstanden habe geht es nicht um eine einmalige Kombination der 4 Felder, sondern um Einmaligkeit des Wertes über alle 4 Felder. Ich kann es ohne Detailkenntnisse nicht wirklich beurteilen, aber ich muss jobo zustimmen, dass das zumindest nach fehlender Normalisierung riecht. Ein paar Zusatzinfos könnten hilfreich sein.
|
AW: Unique bei 4 verschiedenen Feldern
Zitat:
Code:
Will meinen: wenn ZTable1ORDER1.Value und ZTable1ORDER3.Value identische Werte aufweisen, dann ist das ein Fehler, die Werte von ZTable1ORDER2.Value und ZTable1ORDER4.Value sind bei der Prüfung irrelevant.
ZTable1ORDER1.Value = 5
and ZTable1ORDER2.Value = beliebiger Wert and ZTable1ORDER3.Value = 5 -> Fehler and ZTable1ORDER4.Value = beliebiger Wert ZTable1ORDER1.Value = 5 and ZTable1ORDER2.Value = beliebiger Wert and ZTable1ORDER3.Value = alles außer 5 -> ok and ZTable1ORDER4.Value = beliebiger Wert Dann wäre himitsus Ansatz dahingehend abzuändern:
SQL-Code:
ist aber gemeint:
CREATE TABLE irgendwas (
ZTable1Order1 INTEGER, ZTable1Order2 INTEGER, ZTable1Order3 INTEGER, ZTable1Order4 INTEGER, .. CONSTRAINT uk_ZTable1Order UNIQUE (ZTable1Order1, ZTable1Order3) )
Code:
Will meinen: Wenn eine Zahl mehr als einmal in einer beliebigen Kombination der Spalten vorkommen könnte, wäre dies ein Fehler.
ZTable1ORDER1.Value = 5
and (ZTable1ORDER2.Value = 5 or ZTable1ORDER3.Value = 5 or ZTable1ORDER4.Value = 5) -> Fehler ZTable1ORDER1.Value = 5 and (ZTable1ORDER2.Value = alles außer 5 or ZTable1ORDER3.Value = alles außer 5 or ZTable1ORDER4.Value = alles außer 5) -> ok ZTable1ORDER1.Value = 5 and (ZTable1ORDER2.Value = alles außer 5 or ZTable1ORDER3.Value = 5 or ZTable1ORDER4.Value = 5) -> Fehler
SQL-Code:
sofern die Datenbank mehrere Constraints auf einer Tabelle zulässt.
CREATE TABLE irgendwas (
ZTable1Order1 INTEGER, ZTable1Order2 INTEGER, ZTable1Order3 INTEGER, ZTable1Order4 INTEGER, .. CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1, ZTable1Order2) CONSTRAINT uk_ZTable1Order2 UNIQUE (ZTable1Order1, ZTable1Order3) CONSTRAINT uk_ZTable1Order3 UNIQUE (ZTable1Order1, ZTable1Order4) CONSTRAINT uk_ZTable1Order4 UNIQUE (ZTable1Order2, ZTable1Order3) CONSTRAINT uk_ZTable1Order5 UNIQUE (ZTable1Order2, ZTable1Order4) CONSTRAINT uk_ZTable1Order6 UNIQUE (ZTable1Order3, ZTable1Order4) ) Ich gehe dabei davon aus, dass die Zahl 5 als Platzhalter für eine beliebige Zahl steht und nicht explizit als abzufragender Wert gemeint ist. Zitat:
|
AW: Unique bei 4 verschiedenen Feldern
SQL-Code:
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1, ZTable1Order2)
entspricht quasi einem
SQL-Code:
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1 || ',' || ZTable1Order2)
Was du brauchst ist eher ein CheckConstraint mit
SQL-Code:
(NULLs müsste man noch beachten/behandeln)
(Field1 <> Field2) AND (Field1 <> Field3) AND (Field1 <> Field4) AND (Field2 <> Field3) AND (Field2 <> Field4) AND (Field3 <> Field4)
bzw.
SQL-Code:
(Field1 NOT IN [Field2, Field3, Field4]) AND (Field2 NOT IN [Field3, Field4]) AND (Field3 <> Field4)
|
AW: Unique bei 4 verschiedenen Feldern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz