AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Feld darf nur einmal vorkommen
Thema durchsuchen
Ansicht
Themen-Optionen

Feld darf nur einmal vorkommen

Ein Thema von Hansa · begonnen am 24. Mär 2004 · letzter Beitrag vom 28. Mär 2004
Antwort Antwort
Seite 2 von 3     12 3      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#11

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 13:55
Ja, bin doch blind. 8) Aber es gibt noch ein Problem: trotz leerer Tabelle kommt diese Fehlermeldung :
Zitat von IBExpert:
Invalid insert or update value(s): object columns are
constrained - no 2 table rows can have duplicate column values.
attempt to store duplicate value (visible to active transactions) in unique index "RDB$48".
Wenn ich nur die Nr. nehme. Packe ich die ID noch dabei, dann geht es auch. Wo finde ich jetzt, was RDB$48 genau ist ?
Gruß
Hansa
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#12

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 14:03
das ist der interne RDB$Indexname

findest du in Tabelle RDB$Indices
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#13

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 14:16
Schreibe mal ein INSERT per Hand.
Ich denke mal du kannst die Werte mit einem anderen Programm noch nicht sehen, weil die Transaktion nnoch nicht abgeschlossen ist. Es ist aber möglich, dass in deiner Anwendung 2 INSERTs abgesetzt worden.
Wenn dein INSERT "zu Fuss" klappt, dann hast du einen Fehler in der Anwendung (du schreibst 2-mal).
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#14

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 14:25
select * from RDB$INDICES

Dann werden die RDB$RELATION-NAMES aufgeführt unter anderem auch RDB$INDICES. Aber nichts zu sehen von RDB$48
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#15

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 15:59
Moin Hansa,

ZU: "was hat das mit mit alphanumerisch zu tun?"
Alphafelder als primary verlangsamen den Zugriff und machen Dir das Leben im Programm schwerer - prinzipiell geht es schon, aber wer nimmt schon die Säge, um einen Nagel in die Wand zu schlagen?

ZU: "Uniqueproblem"
Wenn Du etwa alt-Datensätze nicht löschst, sondern nur deaktivierst und beim Update statt Update tatsächlich den Altsatz deaktivierst und einen neuen einfügst (um z.B. die Tabelle zu historisieren, also alle Änderungen im Nachhinein nachvollziehbar zu machen), fällst Du natürlich mit dem Unique-Index in der Tabelle auf die Nase, da die Kd-Nummer im Altsatz schon drinn ist, kann der Neusatz nicht eingefügt werden. Wenn das Problem aus der Ecke daherkommt, dann lager die KdNummer in eine Lookuptabelle aus (Fields: (Id Int) und (KdNummer alpha unique)) und speicher in der eigentlichen nur die Id der Kundennummer - dann bist Du das Problem los.

Hoffe das hüleft
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#16

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 18:04
Zitat von Leuselator:
...aber wer nimmt schon die Säge, um einen Nagel in die Wand zu schlagen?
Das geht schon ! z.B. mit der "Rückseite" einer Metallsäge.

Jetzt wirfst Du allerdings einen völlig neuen Aspekt auf, mit der Historie etc. Mit dem zusammengesetzten key wäre das tatsächlich relativ einfach zu machen. Im Moment aber egal.

Ihr macht es aber jetzt immer noch zu kompliziert. Die ID ist der primary key. Die Nr. ist ein integer. Da ich bisher aber keinerlei Performance-Probleme festgestellt habe, sind die Indices vorerst auch mal noch außer Acht gelassen. Die Test-DB hat allerdings nur ca. 30 MB und ist lokal.

Aus Versehen habe ich nun einen Kunden mit derselben Nr. eines bestehenden angelegt. Und das muß ich eben abfangen. Sonst nichts.
Gruß
Hansa
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#17

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 18:06
Wenn die Kunden Nr. numerisch ist, dann schmeiß' die ID weg und mache die Kunden Nr. zum prim. Key.
Färtisch!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#18

Re: Feld darf nur einmal vorkommen

  Alt 24. Mär 2004, 18:32
1. Was habt ihr nur mit dem numerisch/alphanummerisch ? Inwiefern spielt das eine Rolle ?

2. wie wirkt sich aus, welches Feld den Primary Key hat ?

3. Das hier funktioniert :

ALTER TABLE KG ADD CONSTRAINT NQ_KG UNIQUE (NR);
ALTER TABLE KG ADD PRIMARY KEY (ID);

Wenn ich den primary key von ID auf NR lege und den UNIQUE entferne, was ist dann (siehe auch 2) ?

Bei der Kundentable kommt aber eine Fehlermeldung (siehe weiter oben).
Gruß
Hansa
  Mit Zitat antworten Zitat
Delphi_Fanatic

Registriert seit: 24. Mär 2004
201 Beiträge
 
#19

Re: Feld darf nur einmal vorkommen

  Alt 25. Mär 2004, 13:30
Wieso machst Du es nicht einfach so, dass Du in Deinem BeforPost Event mit der SQL-Funktion (Max) den
höchsten Wert Deiner Primary-Key-Spalte ermittelst, einen drauf addierst, und dann den Wert als neuen
Primary-Key abspeicherst ?

So kannst Du Dir doch auf recht simple Weise einen eindeutigen Primary-Key selbst erzeugen.

Wenn Du Dir von der Datenbank irgendwelche Primary-Keys erstellen lässt (wie z.B. mit diesem
Typ 'AutoWert' bei MSAccess), dann bist Du mit Deiner Anwendung auch fest an diese Datenbank
gebunden und kannst nicht so einfach irgendwann mal auf eine andere Datenbank umsteigen.

Wenn Du Dir dagegen selber den Primary-Key erstellst, dann könntest Du Deine Anwendung recht leicht
von der Benutzung einer DB (wie z.B. Access) auf eine andere DB (wie z.B. SQL-Server oder meinetwegen
IB) 'umschalten'.

P.S. und natürlich müßtest Du vor diese Sache mit der Primär-Key-Erstellung eine if-Abfrage setzten,
mit der Du sicherstellts, dass der Primär-Key auch nur dann erstellt wird, wenn er noch nicht vorhanden
ist . (also nur nach einem Insert, und nicht nach jedem Edit => Post).
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#20

Re: Feld darf nur einmal vorkommen

  Alt 25. Mär 2004, 13:47
Das ist doch sinnlos.
Erstens hat es Hansa mit einer DB zu tun (er hat kein Access und Co.), deshalb kann er einen neuen Datensatz an den Server schicken und der generiert innerhalb der DB einen neuen Schlüssel.
Dieses Abfragen, hochzählen und dann erst Abschicken widerspricht doch komplett dem Konzept von stored procedures!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 03:42 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