[MySql] Update mit Bedingungen

Ahiru

Grünschnabel
Hallo - ich habe folgendes Problem:

Ich möchte gerne neue Markt-Daten in eine Tabelle schreiben, aber diese nicht einfach nur neu einfügen, sondern dies ist an Bedingungen geknüpft.

Hier mal zur Verdeutlichung einige Beispieldaten:
Code:
--
-- Tabellenstruktur für die  `marktdaten`-Tabellen
--

CREATE TABLE `old_marketdata` (
  `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
  `orderid` bigint(20) NOT NULL,
  `typeID` bigint(20) NOT NULL,
  `system_id` bigint(20) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `issued_at` datetime NOT NULL,
  `available_volume` int(30) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`orderid`),
  KEY `typeID` (`typeID`),
  KEY `system_id` (`system_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

INSERT INTO `old_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
(1, 1759455689, 3888, 30003530, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-01 20:01:45', 1, '550499.00'),
(1, 1759734230, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 18:30:32', 7, '669997.94'),
(1, 1751274344, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 18:08:07', 7, '669997.95'),
(0, 1761688087, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 17:51:53', 15, '669997.97'),
(1, 1761602515, 1236, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 16:42:56', 4, '669997.98');

CREATE TABLE `new_marketdata` (
  `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
  `orderid` bigint(20) NOT NULL,
  `typeID` bigint(20) NOT NULL,
  `system_id` bigint(20) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `issued_at` datetime NOT NULL,
  `available_volume` int(30) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`orderid`),
  KEY `typeID` (`typeID`),
  KEY `system_id` (`system_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

INSERT INTO `new_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
(1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
(1, 1759734230, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 6, '669997.74'),
(1, 1751274344, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
(1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
(1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91');


--
-- Resultat (soll eigentlich wieder in old_maketdata stehen und dort eingetragen werden - hier jetzt mal per Hand in eine Tabelle geschrieben:
--

CREATE TABLE `result_marketdata` (
  `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
  `orderid` bigint(20) NOT NULL,
  `typeID` bigint(20) NOT NULL,
  `system_id` bigint(20) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `issued_at` datetime NOT NULL,
  `available_volume` int(30) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`orderid`),
  KEY `typeID` (`typeID`),
  KEY `system_id` (`system_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;

INSERT INTO `result_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
(0, 1759455689, 3888, 30003530, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-01 20:01:45', 1, '550499.00'),
(1, 1759734230, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 7, '669997.74'),
(1, 1751274344, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
(0, 1761688087, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 17:51:53', 15, '669997.97'),
(1, 1761602515, 1236, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 16:42:56', 4, '669997.98'),
(1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
(1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
(1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91');
Also was passiert ist folgendes:

Ich habe die alten Marktdaten in der Tabelle old_marketdata. Nun kommen die neuen Daten (alle mit ein und derselben typeID, system_id und gleicher create_at und updated_at Zeit)
Nun soll er:
1. Die alten Daten (where alt.typeID=neu.typeID and alt.system_id=neu.systemID) , die in der neuen Tabelle nicht vorkommen werden auf Aktiv=0 gesetzt.
2. Die Daten, die in der neuen Tabelle vorkommen, aber in der alten nicht werden neu eingetragen.
3. Die Daten, die in beiden Tabellen vorkommen (alt.orderid=neu.orderid) werden neu gesetzt, allerdings behalten sie den alten "created_at"-Wert

Kann ich das mit reinem SQL machen? - Oder würdet ihr das über PHP lösen?
Die Daten in der new_marketdata kommen aus einer per PHP eingelesenen TXT-Datei - da ich aber nicht wusste, wie ich sonst Punkt 1 hätte lösen können dachte ich es sei vielleicht einfacher, die Daten erst einmal in eine Hilfstabelle zu schreiben. Nun komme ich aber nicht so recht weiter.

Vielen Dank schonmal!
 
Zuletzt bearbeitet:
Ich wollte dein Script mal in meine Test-DB einspielen. Das ist voller Fehler.
- Die Tabellen heissen anderst als nachher im INSERT-Statement.
- Die INSERT-Statement sind mehrfach frü dieselben Tabellen
- Vor dem PRIMAR KEY fehlen überall ein Komma

und ich habe immer noch Syntax-Fehlern bei dein INSERTs.

Ich gebs auf diese Daten einzuspielen. Hab grad keine Lust alles duchzugehen bis es funktioniert.

Grundsätzlich:
Mach dich mal über TRIGGER schlas. mit denen kannst du bein Einfügen in eine Tabelle noch etwas durchführen. Ob ein UPDATE auf eine andere Tabelle geht weiss ich gerade nicht auswendig
 
Entschuldige - hatte beim Einstellen hier noch die Tabellennamen geändert, damit sie aussagekräftiger werden, und einige Tabellenspalten die für die Funktion nicht wichtig sind gelöscht, damit es übersichtlicher wird - .... hätte es nochmal testen sollen - sorry nochmal!

Habe es jetzt korrigiert und getestet - sollte nun laufen.

Habe auch schon über den Trigger gelesen (habe 3 Bücher über SQL hier und versuche zusammen mit Google soweit herauszufinden was ich brauche) - aber so ganz ist mir nicht klar, wie ich den hierbei einsetzen soll - bin mir wie gesagt nicht mal sicher, ob es sinnvoll war die Daten zuvor in die Hilfstabelle new_marketdata zu schreiben? - Oder besser direkt Zeile für Zeile beim Einlesen der txt-Datei mit PHP verarbeiten? - Nur habe ich da keine Idee, wie ich dann prüfen kann, ob eine der alten Daten nicht in den neuen vorhanden und damit inaktiv ist?
 
Ich glaube du gehst das ganze viel zu kompliziert an.

Also, du hast eine Tabelle mit Daten.
Dann kommen Daten aus einem Textfile.
1) Alle Daten die nicht mehr kommen, sollen auf aktiv=0 gesetzt werden.
2) Alle Daten die Vorhanden sind, sollen vorhanden bleiben mit demselben created_at
3) Alle Daten die neu sind, werden neu eingetragen.

Meine kleine Gegenfrage.
Was machst du mit der alt und der neu Tabelle. Sind das im Endeffekt wirklich 2 getrennte Tabellen die du später auch getrennt verwendest? Wenns am Ende wieder nur eine Tabelle ist, schlage ich dir den folgenden Losungsansatz vor.

SQL:
--Alle bestehenden Marktdaten auf Inaktiv setzen
UPDATE marketdata
SET Aktiv = 0;

--Die neuen Daten mittels INSERT....ON DUPLICATE Einfügen oder wenn bereits vorhanden, auf Aktiv=1 setzen
INSERT INTO marketdata(`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`)
VALUES 
(1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
(1, 1759734230, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 6, '669997.74'),
(1, 1751274344, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
(1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
(1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91')
ON DUPLICATE KEY UPDATE 
	Aktiv = 1;
 
Zuletzt bearbeitet von einem Moderator:
Ist nur eine Tabelle - die 2. war nur eine Hilfstabelle.
Mein Problem mit dem "on duplicate key update" war, dass er dann alle Daten überschreibt - auch das "created_at".
 

Neue Beiträge

Zurück