Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbank Duplicates (https://www.delphipraxis.net/152432-datenbank-duplicates.html)

idefix2 23. Jun 2010 00:04

AW: Datenbank Duplicates
 
Ja, Du hast recht, so wie oben geschrieben geht es nicht. aber so:
SQL-Code:
select upper(ip_name) from musik
group by upper(ip_name) having count(*)>1
Das hab ich in meiner DB probiert, ip_name -> feld, musik -> tabelle

-187- 23. Jun 2010 05:42

AW: Datenbank Duplicates
 
Hm wie es scheint bist du dem Problem auf die Schliche gekommen. Da ist die genau die Anzahl an Duplicates. Meine SQL Kenntnisse sind minimal. Was genau machen wir jetzt anders ? Wir selektieren alle UPPER CASE records die es öfter als einmal gibt. Wieso wurden die vorher nicht mit überprüft ? Oder macht das DBMS einen unterschied zwischen AAA und aaa ?

mkinzler 23. Jun 2010 06:40

AW: Datenbank Duplicates
 
Natürlich besteht ein Unterschied zwischen 'AAA', 'aaa' und 'Aaa' usw. Willst das nicht musst du einen Expression-Index auf UPPER() anlegen ( geht ab FB 2.1)

borwin 23. Jun 2010 06:43

AW: Datenbank Duplicates
 
Bei der Abfrage wird der Inhalt des Feldes genau überprüft. Dabei erflogt die Überprüfung Zeichenweise und ein 'A' ist dann etwas anderes als ein 'a'. Um das zu umgehen werden alle Zeichen auf UPPER gesetzt. Eine weitere Falle beim abfragen von Texten sind die Leerzeichen. Für die Datenbank ist 'MEIER' und 'MEIER ' nicht gleich. Um auch diesen Fall zu umgehen noch ein TRIM um die Felder legen.
Dann sieht das ganze dann so aus
Code:
SELECT TRIM(UPPER(ip_name))
FROM musik
GROUP BY TRIM(UPPER(ip_name))
HAVING COUNT(*)>1
Um das Einfügen von doppelten Datensätzen zu verhindern musst Du Deinen Index verändern.
Lege ein sogenantes COMPUTER BY Feld an mit Index an

Zitat:

create index idx_name on musik computed by (trim(upper(ip_name)));
Das verhinder schon doppelte Datensätze. Geht ab FB 2.0

Gruß Borwin

-187- 23. Jun 2010 07:32

AW: Datenbank Duplicates
 
Hm borwin also doppelte Einträge bekomme ich nicht dank dieser Zeile:

Delphi-Quellcode:
IBTable1.AddIndex('UNIQUE', 'NAMES', [ixUnique, ixCaseInsensitive]);
Ich glaube ich werde die strings bevor ich zu der DB hinzufüge einfach einmal vorbehandeln:


Delphi-Quellcode:
MyStr:= LowerCase(MyStr);
Damit sollte das Problem endlich gelöst sein, Danke ! :)

idefix2 23. Jun 2010 10:13

AW: Datenbank Duplicates
 
Zitat:

Natürlich besteht ein Unterschied zwischen 'AAA', 'aaa' und 'Aaa' usw.
So natürlich ist es nicht. Wenn eine Collating Sequence für die Spalte angegeben ist, der Case-insensitiv ist, behandelt Firebird nach dem, was ich bis jetzt gelesen hat, unterschiedliche Case-Werte auch im Vergleich als identisch.

Die neusten Versionen von Firebird erlauben eigene Collating Sequences zu erstellen, wenn Du willst, dass Gross und Kleinbuchstaben in dem Feld als gleich behandelt werden, müsstest Du eine entsprechende Collating Sequence erstellen und bei dem Feld angeben.

mkinzler 23. Jun 2010 10:23

AW: Datenbank Duplicates
 
Da ist aber der Weg über den Expression Index einfacher

-187- 23. Jun 2010 11:03

AW: Datenbank Duplicates
 
Angenommen ich füge diesen Index im nachhinein ein, werden dann die (jetzt neuen) Duplicates rausgeschmissen oder wie verhält sich das?

mkinzler 23. Jun 2010 11:20

AW: Datenbank Duplicates
 
Nein, werden sie wohl nicht. was aber geanu passiert, kann ich dir nicht sagen.

idefix2 23. Jun 2010 11:38

AW: Datenbank Duplicates
 
Zitat:

Da ist aber der Weg über den Expression Index einfacher
Es kommt darauf an. Bei einer kleinen Anwendung mit nur einer derartigen Spalte und einer Abfrage ist das etwas einfacher - wobei ja eine case-insensitive Collation in einem einzeiler von einer case-sensitiven abgeleitet werden kann, also auch nicht sehr kompliziert ist.

Bei einer grösseren Anwendung, wenn man viele Datenbankfelder standardmässig case insentiv haben will, sollte man aber auf jeden Fall besser eine collation erstellen. Sonst muss man bei jeder SQL-Abfrage auf Gleichheit an das Uppercase denken. Prinzipiell sollte man beim Design einer Anwendung eher darauf schauen, möglichst viel Logik in die Datenbank-DLL auszulagern (Trigger, Collations, Calculated Fields, Views). Dann ist die Programmierung der Anwendungen nachher schneller und weniger fehleranfällig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 2 von 6     12 34     Letzte »    

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