Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Duplexcheck in Tabelle (https://www.delphipraxis.net/154084-sql-duplexcheck-tabelle.html)

stho 27. Aug 2010 05:54

Datenbank: MySQL • Version: 5,1 • Zugriff über: -

SQL-Duplexcheck in Tabelle
 
Hallo leute

Ich habe ein kleines Problem was ich mit Hilfe von Google & Co. nicht gelöst bekomme... :-(
Ich habe eine Tabelle (Tabelle X) mit verschiedenen Spalten (ID als Autoincrement-> Spalte0, Spalte1, Spalte2, Spalte3)

Nun will ich das altbekannte Spielchen spielen: Wert adieren wenn Eintrag schon vorhanden, ansonsten anlegen
Dazu habe ich folgenden Code benutzt:

---
INSERT INTO Tabelle (Spalte1, Spalte2, Spalte3) VALUES (3, 18, 12)
ON DUPLICATE KEY UPDATE Spalte3 = Spalte3 + 12
---

Nun legt er mir jedes mal einen neuen Eintrag an wenn ich das ausführe.
Ich weiß, das liegt am Autoincrement (er entdeckt also keinen duplex)
Wie schaffe ich es trotzdem das er nur die duplikate in bestimmten Spalten prüft?
Sprich:
-> Als Duplex erkennen wenn Spalte1 und Spalte2 schon vorhanden sind?

Währe schön wenn ihr mir helfen könntet

schlecki 27. Aug 2010 06:02

AW: SQL-Duplexcheck in Tabelle
 
hi,

hast du auch einen entsprechenden Index (unique) auf die zu prüfenden Spalten gelegt?

stho 27. Aug 2010 06:12

AW: SQL-Duplexcheck in Tabelle
 
vielen dank schonmal das mir jemand um diese uhrzeit antwortet :thumb:

naja, jeder eintrag ist an und für sich unique weil die ID sich jedes mal automatisch erhöht... :-(
Jedoch würde ich gerne wissen wie und ob man die bedingungen für einen duplex festlegen kann

schlecki 27. Aug 2010 06:29

AW: SQL-Duplexcheck in Tabelle
 
versuch mal, einen unique index auf die spalte1 und spalte2 zu legen, dann müsste eigentlich der update-teil ausgeführt werden

stho 27. Aug 2010 06:40

AW: SQL-Duplexcheck in Tabelle
 
hab jetzt aufspalte 1 und spalte 2 einen primärschlüssel gesetzt und die auto-ID (spalte 0) raus gelöscht...

Es funktioniert! :-)
Absolut geil :-D

:thumb: :thumb: :thumb:

Vielen vielen tausend dank!!!

schlecki 27. Aug 2010 07:56

AW: SQL-Duplexcheck in Tabelle
 
hm, so meinte ich das eigentlich nicht ;)

du solltest keinen Primär, sondern einen Unique-Index auf die beiden Spalten legen. Man kann durch aus mehrere Indizes pro Tabelle anlegen. Ich war zwar jetzt im Kopf bei FB, aber MySQL kann das mit Sicherheit auch ;)

und die autoIncrement-Spalte würde ich auch wieder einfügen und als Primärindex nehmen.

stho 30. Aug 2010 05:32

AW: SQL-Duplexcheck in Tabelle
 
so, ich bins nochmal...
leider hat sich nach einiger zeit (deshalb schreibe ich erst jetzt) herausgestellt das das was ich gemacht habe NICHT wirklich das ist was ich möchte ^^
und selbst das mit dem unique-index ist keine wirkliche lösung...
aber ich glaube es liegt einfach daran das ich mein problem nicht anständig genug geschildert habe...

Spalte 1 (Enthällt eine Benutzer-ID)
Spalte 2 (Enthällt die ID einer Beschreibung)
Spalte 3 (Enthällt den Wert der dahinter steht)

Nun soll die Kombination aus Spalte 1 und 2 unique sein...
Es ist aber nicht klar ob Benutzer X (Spalte1) einen Wert (Spalte 3) vom Typ Y (Spalte 2) hinterlegt hat.
Wenn er dies getan hat soll der Wert einfach addiert werden, ansonsten soll der Eintrag angelegt werden.

Und so wie ich es bisher gemacht habe scheint es nicht zu funktionieren :-(
Ich kann entweder einen Primärschlüssel auf Spalte 1 oder auf Spalte 2 legen...
Aber nicht beide...

taveuni 30. Aug 2010 06:51

AW: SQL-Duplexcheck in Tabelle
 
Es gibt zusammengesetzte Primärschlüssel. Das ist vermutlich das was Du suchst.
Ich würde aber grundsätzlich davon abraten fachliche Felder als PK zu verwenden.
Weder einzeln noch zusammengesetzt. Hier einfach eine Tabellen ID nehmen.
PK, Autoincrement das ist alles. Wir nehmen bei einigermassen komplexen Strukturen
sogar Datenbankweite Unique PK's.
Das ist teilweise eine Art glaubensfrage. Aber irgendwann wirst Du bei einer Erweiterung
an die Grenzen fachlicher PK' stossen.
Dazu gibt's hier im Forum wie auch anderswo verschiedene Threads.

schlecki 30. Aug 2010 09:42

AW: SQL-Duplexcheck in Tabelle
 
also, ich habe es jetzt nochmal mit mysql getestet. Lege eine Tabelle mit folgendem DDL an

SQL-Code:
CREATE TABLE IF NOT EXISTS `testtable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Spalte1` int(11) NOT NULL,
  `Spalte2` int(11) NOT NULL,
  `Spalte3` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `UQ_1_2` (`Spalte1`,`Spalte2`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ;
Führe jetzt dieses SQL aus:
Code:
INSERT INTO Tabelle (Spalte1, Spalte2, Spalte3) VALUES (3, 18, 12)
ON DUPLICATE KEY UPDATE Spalte3 = Spalte3 + 12
es wurde ein neuer Datensatz eingefügt. Jetzt nochmal ausführen => der bereits angelegte Datensatz wurde aktualisiert.

Warum? Es existiert ein "Unique Key" auf den Spalten 1 & 2.

stho 30. Aug 2010 09:54

AW: SQL-Duplexcheck in Tabelle
 
Leute, ihr seid klasse :-)
Hier kann ich noch richtig was lernen ^^

Vielen tausend dank für eure Hilfe, probiere das heute abend wenn ich zuhause bin mal aus :-)
Danke danke danke!!! :thumb:


EDIT:
Achja, hab vergessen zu erwähnen das man eure Erklärung (mit Beispiel) wunderbar verstehen kann :-)

EDIT2:
ES KLAPPT!!!! *mega freu*
Tausend dank euch beiden nochmal :-)
Jetzt hab ich wieder was gelernt!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf