AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Unique bei 4 verschiedenen Feldern
Thema durchsuchen
Ansicht
Themen-Optionen

Unique bei 4 verschiedenen Feldern

Ein Thema von ATS3788 · begonnen am 15. Jan 2014 · letzter Beitrag vom 29. Jan 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von ATS3788
ATS3788

Registriert seit: 18. Mär 2004
Ort: Kriftel
646 Beiträge
 
Delphi XE Starter
 
#1

Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 11:11
Datenbank: Firebird • Version: 2.5 • Zugriff über: Zeos
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 ?
Martin MIchael
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 11:25
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.
Gruß, Jo

Geändert von jobo (15. Jan 2014 um 11:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 11:30
Da würde sich doch ein Trigger auf der Datenbank anbieten.
Einfach mal Tante Google fragen -> Bei Google suchenDatenbank Trigger Firebird
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.164 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 11:42
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.
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 ''
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jan 2014 um 12:26 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 12:21
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.
Gruß, Jo

Geändert von jobo (15. Jan 2014 um 12:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.164 Beiträge
 
Delphi 12 Athens
 
#6

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 12:28
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jan 2014 um 12:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 12:32
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 13:45
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.

Ist das verständlich, was ich möchte ?
leider nein.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.164 Beiträge
 
Delphi 12 Athens
 
#9

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 13:58
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1, ZTable1Order2)
entspricht quasi einem
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1 || ',' || ZTable1Order2)

Was du brauchst ist eher ein CheckConstraint mit
(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. (Field1 NOT IN [Field2, Field3, Field4]) AND (Field2 NOT IN [Field3, Field4]) AND (Field3 <> Field4)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jan 2014 um 14:03 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Unique bei 4 verschiedenen Feldern

  Alt 15. Jan 2014, 14:11
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1, ZTable1Order2) entspricht quasi einem
CONSTRAINT uk_ZTable1Order1 UNIQUE (ZTable1Order1 || ',' || ZTable1Order2) Was du brauchst ist eher ein CheckConstraint mit
(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. (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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz