INDEX UNIQUE + RowsAffected

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

INDEX UNIQUE + RowsAffected

Beitrag von Wonderer »

Hallo,

ich habe gerade herausgefunden, dass man ein Hinzufügen von einem Datensatz direkt verhindern kann, wenn ein INDEX UNIQUE aktiviert ist.

Kann ich nach einem DBCOMMIT mit einer Funktion herausfinden ob ein Hinzufügen oder Ändern am Datensatz vorgenommen wurde oder doch verworfen wegen z.b. einer UNIQUE Restriktion?
Oder sowas wie in PHP das eine Anzahl der vom COMMIT betroffenen Zeilen zurückgeliefert wird?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: INDEX UNIQUE + RowsAffected

Beitrag von Tom »

Hallo, Wonderer.

Nein, ein Unique-Index verhindert nicht das Anhängen eines Datensatzes, der eine Doppelung im Index erzeugen würde. Der Datensatz wird in diesem Index einfach nicht berücksichtigt. Wenn andere Indexe aktiv sind und auf diese führend umgeschaltet wird, taucht der angehängte Datensatz auf. Noch problematischer wird es, wenn man den bereits indexierten Datensatz löscht - dann taucht der neue Datensatz, der vermeintlich nicht vorhanden ist, erst nach einer Reindexierung auf. Dazu gibt es umfangreiche Threads hier im Forum. "Unique" bedeutet schlicht: Indexiere einen Datensatz nicht, dessen Schlüsselwert bereits im Index vorhanden ist. Der Datensatz wird dennoch angelegt - und ist, wie erwähnt, in ggf. anderen Indexen vorhanden. Bei DbSetOrder(0) sieht man ihn auch.
Herzlich,
Tom
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: INDEX UNIQUE + RowsAffected

Beitrag von Wonderer »

Oh, danke.. Jetzt fällt mir auch auf dass der Index hier keine Restriktion der Tabellen-Felder an sich ist wie in MySQL - eher so was wie VIEW?

NAja, ich bleib mal lieber still was das angeht - VIEW in MySQL hab ich auch noch nicht wirklich verwendet. :color:
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: INDEX UNIQUE + RowsAffected

Beitrag von Tom »

Hallo, Wonderer.

Wie gesagt, such doch einfach mal nach "UNIQUE" im Forum. Die Bedeutung ist relativ einfach: Wenn ein Datensatz angefügt oder verändert (!) wird, wird diesem im fraglichen Index nur dann berücksichtigt, wenn es diesen Schlüsselwert dort noch nicht gibt.

Tabelle "artikel" hat einen Unique-Index auf "artikelnr". Der Index ist aktiv. Die Tabelle enthält bislang folgende Daten:

(Bezeichnung,Artikelnr.)
"Testartikel","1"
"Testartikel 2","2"

Jetzt:
"Testartikel 3" mit Artikelnr "2" wird angehängt
-> Der Datensatz existiert, ist im Index jedoch nicht vorhanden. Man sieht ihn beim Abschalten der Indexsortierung oder beim Umschalten auf einen anderen Index

Die Artikelnr. von "Testartikel 2" (!) wird auf "3" geändert
-> "3" ist im Index, "2" aber nicht mehr (obwohl es "Testartikel 3" mit dieser Nummer gibt), sondern erst nach einem Reindexieren. Die Ursache liegt darin, dass die Betrachtung des Unique-Indexes immer nur bezogen auf den aktuellen Datensatz erfolgt

oder

"Testartikel 2" wird gelöscht
-> "Testartikel 3" mit der nun eindeutigen Nummer ist immer noch nicht im Index, siehe voriger Punkt


Die ganze Systematik ist also nicht ungefährlich; ich würde Unique-Indexe deshalb nur für Auswertungen verwenden, niemals jedoch für aktive Daten.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: INDEX UNIQUE + RowsAffected

Beitrag von brandelh »

Natürlich kann man aber vom Programm sowas vorsehen !

FLOCK() auf Datei, damit kein anderer kann ...
dbseek() prüfen ob der Satz existiert ...
wenn ja ... Meldung oder Ändern je nach Bedarf
wenn nein, neu anlegen.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: INDEX UNIQUE + RowsAffected

Beitrag von georg »

oder auf eine vernünftige Datenbasis wie SQL umstellen, dann macht der SQL-Server das nämlich selbst.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: INDEX UNIQUE + RowsAffected

Beitrag von Wonderer »

danke für die Erklärungen..
Antworten