Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Unique bei 4 verschiedenen Feldern (https://www.delphipraxis.net/178566-unique-bei-4-verschiedenen-feldern.html)

ATS3788 15. Jan 2014 12:11

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:
 ZTable1ORDER1 : TLargeintField;
 ZTable1ORDER2 : TLargeintField;
 ZTable1ORDER3 : TLargeintField;
 ZTable1ORDER4 : TLargeintField;
und möchte das die Datenbank die vier Felder
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:

jobo 15. Jan 2014 12:25

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.

Jasocul 15. Jan 2014 12:30

AW: Unique bei 4 verschiedenen Feldern
 
Da würde sich doch ein Trigger auf der Datenbank anbieten.
Einfach mal Tante Google fragen -> Bei Google suchenDatenbank Trigger Firebird

himitsu 15. Jan 2014 12:42

AW: Unique bei 4 verschiedenen Feldern
 
Geht sowas im Firebird nicht?
SQL-Code:
CREATE TABLE irgendwas (
  ZTable1Order1 INTEGER,
  ZTable1Order2 INTEGER,
  ZTable1Order3 INTEGER,
  ZTable1Order4 INTEGER,
  ..
  CONSTRAINT uk_ZTable1Order UNIQUE (ZTable1Order1, ZTable1Order2, ZTable1Order3, ZTable1Order4)
)
Oder kann dieser Constraint nur jeweils ein Feld behandeln? (konnte ich auf die Schnelle nicht aus der Doku erkennen)

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 ''

jobo 15. Jan 2014 13:21

AW: Unique bei 4 verschiedenen Feldern
 
Zitat:

Zitat von himitsu (Beitrag 1243767)
Geht sowas im Firebird nicht?

äh- nicht aufgepasst. Hab das coalesce nicht gesehen.
Weiß nicht ob FB das kann.
Weiß auch nicht, ob es das Problem des TE beseitigt.

himitsu 15. Jan 2014 13:28

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.

DeddyH 15. Jan 2014 13:32

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.

nahpets 15. Jan 2014 14:45

AW: Unique bei 4 verschiedenen Feldern
 
Zitat:

Zitat von ATS3788 (Beitrag 1243761)
Ohh
Mir fällt keine guter Titel ein sorry.
Ich habe vier Felder

Delphi-Quellcode:
 ZTable1ORDER1 : TLargeintField;
 ZTable1ORDER2 : TLargeintField;
 ZTable1ORDER3 : TLargeintField;
 ZTable1ORDER4 : TLargeintField;
und möchte das die Datenbank die vier Felder 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.

Bitte ein paar mehr Beispiele, damit erahnbar wird, was Du meinen könntest.
Code:
    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
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.

Dann wäre himitsus Ansatz dahingehend abzuändern:
SQL-Code:
CREATE TABLE irgendwas (
  ZTable1Order1 INTEGER,
  ZTable1Order2 INTEGER,
  ZTable1Order3 INTEGER,
  ZTable1Order4 INTEGER,
  ..
  CONSTRAINT uk_ZTable1Order UNIQUE (ZTable1Order1, ZTable1Order3)
)
ist aber gemeint:
Code:
    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
Will meinen: Wenn eine Zahl mehr als einmal in einer beliebigen Kombination der Spalten vorkommen könnte, wäre dies ein Fehler.
ZTable1ORDER1 ZTable1ORDER2 ZTable1ORDER3 ZTable1ORDER4 Fehler
5alles außer 5alles außer 5alles außer 5nein
55alles außer 5alles außer 5ja
5alles außer 55alles außer 5ja
5alles außer 5alles außer 55ja
alles außer 55alles außer 5alles außer 5nein
alles außer 555alles außer 5ja
alles außer 55alles außer 55ja
...............
Dann wäre himitsus Ansatz dahingehend abzuändern:
SQL-Code:
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)
)
sofern die Datenbank mehrere Constraints auf einer Tabelle zulässt.

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:

Zitat von ATS3788 (Beitrag 1243761)
Ist das verständlich, was ich möchte ?:pale:

leider nein.

himitsu 15. Jan 2014 14:58

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:
(Field1 <> Field2) AND (Field1 <> Field3) AND (Field1 <> Field4) AND (Field2 <> Field3) AND (Field2 <> Field4) AND (Field3 <> Field4)
(NULLs müsste man noch beachten/behandeln)
bzw.
SQL-Code:
(Field1 NOT IN [Field2, Field3, Field4]) AND (Field2 NOT IN [Field3, Field4]) AND (Field3 <> Field4)

nahpets 15. Jan 2014 15:11

AW: Unique bei 4 verschiedenen Feldern
 
Zitat:

Zitat von himitsu (Beitrag 1243786)
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:
(Field1 <> Field2) AND (Field1 <> Field3) AND (Field1 <> Field4) AND (Field2 <> Field3) AND (Field2 <> Field4) AND (Field3 <> Field4)
(NULLs müsste man noch beachten/behandeln)
bzw.
SQL-Code:
(Field1 NOT IN [Field2, Field3, Field4]) AND (Field2 NOT IN [Field3, Field4]) AND (Field3 <> Field4)

Stimmt, bei meinem Vorschlag wäre ja eine Zahlendublette in beliebiger Spaltenkombination zulässig :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.
Seite 1 von 3  1 23      

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