Textdatei und MySQL updaten
Guten Abend,
mit u.s. PHP Skript befülle ich eine MySQL Tabelle mit einer Textdatei, bei der sich der Inhalt ergänzen bzw. auch ändern kann. Die DataID im Text File bleibt immer gleich.
Ich habe jetzt das Problem, dass immer wenn ich das Skript ausführe, werden die Daten immer wieder neu importiert und nicht, falls Datensätze bereits vorhanden sind, geupdatet.
Wie kann ich es hinbekommen, dass vorhandene Datensätze geupdatet und neue neu eingefügt werden?
PHP Skript:
Textfile:
Datenbankaufbau:
mit u.s. PHP Skript befülle ich eine MySQL Tabelle mit einer Textdatei, bei der sich der Inhalt ergänzen bzw. auch ändern kann. Die DataID im Text File bleibt immer gleich.
Ich habe jetzt das Problem, dass immer wenn ich das Skript ausführe, werden die Daten immer wieder neu importiert und nicht, falls Datensätze bereits vorhanden sind, geupdatet.
Wie kann ich es hinbekommen, dass vorhandene Datensätze geupdatet und neue neu eingefügt werden?
PHP Skript:
$conn = mysqli_connect('localhost','root','','demo');
if(!$conn)
{
die(mysqli_error());
}
$open = fopen('employee-data.txt','r');
while (!feof($open))
{
$getTextLine = fgets($open);
$explodeLine = explode(",",$getTextLine);
list($dataid,$name,$city,$postcode,$job_title) = $explodeLine;
$qry = "insert into empoyee_details (dataid,name, city,postcode,job_title) values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."')";
mysqli_query($conn,$qry);
}
fclose($open);
Textfile:
1,Heber,Camrynborough,26728,Home Health Aide
2,Modesto,West Janet,15152-2683,Software Engineer
Datenbankaufbau:
CREATE TABLE `empoyee_details` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`dataid` VARCHAR(255) NULL DEFAULT NULL,
`name` VARCHAR(255) NULL DEFAULT NULL,
`city` VARCHAR(255) NULL DEFAULT NULL,
`postcode` VARCHAR(255) NULL DEFAULT NULL,
`job_title` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2862695064
Url: https://administrator.de/contentid/2862695064
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
6 Kommentare
Neuester Kommentar
Ist doch logisch. Du machst ja jedes Mal einen INSERT für jeden Datensatz. Egal ob er schon in der DB ist oder nicht.
Du musst die Spalte mit dem Index UNIQUE erstellen und dann beim Import entweder ein INSERT oder UPDATE machen. Je nachdem ob es den Eintrag schon gibt oder nicht: Stichwort ON DUPLICATE (auch Upsert genannt)
Manuel
Du musst die Spalte mit dem Index UNIQUE erstellen und dann beim Import entweder ein INSERT oder UPDATE machen. Je nachdem ob es den Eintrag schon gibt oder nicht: Stichwort ON DUPLICATE (auch Upsert genannt)
Manuel
Eigentlich dachte ich es wäre kein Problem das mit der Suchmaschine deiner Wahl zu finden.
Du musst dein SQL-Statement anpassen
Siehe: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
Manuel
Du musst dein SQL-Statement anpassen
INSERT INTO tabelle ( ... ) VALUES ( ...) ON DUPLICATE KEY UPDATE tabelle SET ...
Siehe: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
Manuel
Moin,
Nein. In VALUES() gehört der Spaltenname deren neuer Wert verwendet werden soll also z.B. »name = VALUES(name)«. Aber: laut Handbuch ("Note"-Block bei ca. einem Drittel der Seite) ist die VALUES()-Variante ab MySQL 8.0.20 veraltet und es sollte die dort beschriebene Variante mit einem Alias für die neue Zeile verwendet werden.
Noch ein großes Aber: das ganze wird so nicht funktionieren: du hast keine der im INSERT verwendeten Spalten als UNIQUE definiert womit der "DUPLICATE KEY"-Fall nie eintritt. Du musst dataid in die id-Spalte schreiben oder dataid einen UNIQUE-Key verpassen. Und: warum liest du csv-Daten nicht als solche ein? Das ganze mit explode zu zerlegen ist fehleranfällig …
Was hier allerdings völlig falsch bzw. gefährlich ist, ist die fehlende Behandlung des wusstest es doch eigentlich mal besser …
Gruß
Tobias
Nein. In VALUES() gehört der Spaltenname deren neuer Wert verwendet werden soll also z.B. »name = VALUES(name)«. Aber: laut Handbuch ("Note"-Block bei ca. einem Drittel der Seite) ist die VALUES()-Variante ab MySQL 8.0.20 veraltet und es sollte die dort beschriebene Variante mit einem Alias für die neue Zeile verwendet werden.
Noch ein großes Aber: das ganze wird so nicht funktionieren: du hast keine der im INSERT verwendeten Spalten als UNIQUE definiert womit der "DUPLICATE KEY"-Fall nie eintritt. Du musst dataid in die id-Spalte schreiben oder dataid einen UNIQUE-Key verpassen. Und: warum liest du csv-Daten nicht als solche ein? Das ganze mit explode zu zerlegen ist fehleranfällig …
values('".$dataid."','".$name."','".$city."','".$postcode."','".$job_title."'),
Was hier allerdings völlig falsch bzw. gefährlich ist, ist die fehlende Behandlung des wusstest es doch eigentlich mal besser …
Gruß
Tobias