AW: Datenbank Duplicates
Ja, Du hast recht, so wie oben geschrieben geht es nicht. aber so:
SQL-Code:
Das hab ich in meiner DB probiert, ip_name -> feld, musik -> tabelle
select upper(ip_name) from musik
group by upper(ip_name) having count(*)>1 |
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 ?
|
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)
|
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:
Um das Einfügen von doppelten Datensätzen zu verhindern musst Du Deinen Index verändern.
SELECT TRIM(UPPER(ip_name))
FROM musik GROUP BY TRIM(UPPER(ip_name)) HAVING COUNT(*)>1 Lege ein sogenantes COMPUTER BY Feld an mit Index an Zitat:
Gruß Borwin |
AW: Datenbank Duplicates
Hm borwin also doppelte Einträge bekomme ich nicht dank dieser Zeile:
Delphi-Quellcode:
Ich glaube ich werde die strings bevor ich zu der DB hinzufüge einfach einmal vorbehandeln:
IBTable1.AddIndex('UNIQUE', 'NAMES', [ixUnique, ixCaseInsensitive]);
Delphi-Quellcode:
Damit sollte das Problem endlich gelöst sein, Danke ! :)
MyStr:= LowerCase(MyStr);
|
AW: Datenbank Duplicates
Zitat:
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. |
AW: Datenbank Duplicates
Da ist aber der Weg über den Expression Index einfacher
|
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?
|
AW: Datenbank Duplicates
Nein, werden sie wohl nicht. was aber geanu passiert, kann ich dir nicht sagen.
|
AW: Datenbank Duplicates
Zitat:
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. |
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