Schrift
[thread]3662[/thread]

Datenbank einträge vergleichen und einfügen: Datenbank einträge vergleichen und einfü



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
martin101
 2006-03-07 16:24
#34074 #34074
User since
2006-03-07
8 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte aus einer Datenbank Einträge auslesen und in eine neue Einfügen.

So wie es jetzt ist wird nur der erste Eintrag eingefügt.

Kann mir da jemand helfen das alle gefundenen Einträge eigefügt werden?
Gibt es eine Möglichkeit die Einträge vor dem Einfügen zu vergleichen um doppelte zu vermeiden?

------------------------------------------------------------------------------------------

-------
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  
#SQL-Abfrage -500=5Minuten; -50000=5Stunden JJJJMMDDHHMMSS

$sth =$dbh->prepare ("
SELECT *
FROM Daten
WHERE time BETWEEN sysdate()-500000 AND sysdate()-0
");

$sth->execute ();

while
( @zeile =$sth->fetchrow_array ())
{
printf br
("ID = %s, time = %s, gerät = %s, beschreibung = %s, text = %s, index =%s, test = %s" ),
$id=$zeile[0],
$time=$zeile[1],
$geraet=$zeile[2],
$beschreibung=$zeile[3],
$text=$zeile[4],
$index= $zeile[5],
$test=$zeile[6],
};

$dbh1->do
(qq
{ID, time, gerät , beschreibung , text, index , test ")
VALUES(?,?,?,?,?,?,?)
},
undef,
$id,
$time,
$geraet,
$beschreibung,
$text,
$index,
$test,

);

----------------------------------------------------------------------------------------
Gruß und Danke\n\n

<!--EDIT|renee|1141753451-->
nepos
 2006-03-07 17:38
#34075 #34075
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Kann ja so nicht klappen. Du laeufst zwar in der while-Schleife ueber alle Zeilen drueber, der Insert wird aber nur auf die letzte Zeile ausgefuehrt, da er nicht in der While-Schleife drinsteht.
Wenn die DB keine doppelten Zeilen enthalten soll, waere der erste Schritt ein entsprechender Unique-Key auf die Tabelle. Dann bist du da mal auf der sicheren Seite.
Wenn du dann doppelte Eintraege einfuegen willst, wird die Datenbank meckern und dann bleibt es dir ueberlassen, wie du damit umgehst. Ich hab hier sowas, wo ich dann einfach ein Warning ausgebe, dass der Eintrag doppelt war.
murphy
 2006-03-07 18:19
#34076 #34076
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Außerdem dürfte es effizienter sein, die Daten nicht erst in Perl auszulesen und dann wieder in die SQL-Maschine zu füttern, sondern alles in einem SQL-Befehl zu erledigen:
Code: (dl )
INSERT INTO neue_tabelle(feld0, feld1, ...) SELECT feld0, feld1, ... FROM alte_tabelle WHERE bedingung ...;

Dabei kann man natürlich auch noch doppelte Einträge entfernen lassen, indem man einfach
Code: (dl )
INSERT INTO neue_tabelle(feld0, feld1, ...) SELECT DISTINCT feld0, feld1, ... FROM alte_tabelle WHERE bedingung ...;
daraus macht.\n\n

<!--EDIT|murphy|1141748481-->
When C++ is your hammer, every problem looks like your thumb.
martin101
 2006-03-08 18:05
#34077 #34077
User since
2006-03-07
8 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die schnelle Hilfe?
Bin halt noch Anfänger.

Gibt es auch eine Möglichkeit zu prüfen ob der Datensatz in der letzten halben Stunde eingetragen wurde und ihn in disem Fall nicht einzutragen?
nepos
 2006-03-08 18:07
#34078 #34078
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn der Datensatz nicht ein entsprechendes Feld enthaelt, nein.
martin101
 2006-03-08 18:30
#34079 #34079
User since
2006-03-07
8 Artikel
BenutzerIn
[default_avatar]
Meinst du jetzt ein extra Feld: geprüft ?
oder wie müßte so ein Feld ausehen?
nepos
 2006-03-08 18:52
#34080 #34080
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du koenntest eine Spalte in der Tabelle einfuegen, in der du einen Timestamp speicherst. Als Default-Wert nimmst du die aktuelle Zeit, dann musst du deine INSERT-Kommandos nicht mal anpassen, da so automatisch die Zeit genommen wird, zu der der Datensatz angelegt wurde.
Nun kannst du vor jedem INSERT nachpruefen, ob es schon einen Datensatz mit denselben Werten gibt, dessen Zeitstempel groesser als Now() - 30 Minuten ist.
Wenn das der Fall ist, brauchst du nichts einfuegen.
martin101
 2006-03-08 18:59
#34081 #34081
User since
2006-03-07
8 Artikel
BenutzerIn
[default_avatar]
Das ist sehr gut. Vielen Dank
Werde ich gleich mal ausprobieren.

Mal sehen ob ich das mit den nachpruefen hinbekomme.
Gast Gast
 2006-03-08 22:41
#34082 #34082
[quote=nepos,08.03.2006, 17:52]Nun kannst du vor jedem INSERT nachpruefen, ob es schon einen Datensatz mit denselben Werten gibt, dessen Zeitstempel groesser als Now() - 30 Minuten ist.
Wenn das der Fall ist, brauchst du nichts einfuegen.[/quote]
Hast du vielleicht ein Beispiel dazu.
Das mit der Zeit geht.
Aber wie prüfe ich nach ob es schon einen Datensatz in der neuen Tabelle gibt, wo in den letzten 30Minuten der selbe Fehler und das gleiche Gerät drin ist?
nepos
 2006-03-09 12:26
#34083 #34083
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, nachdem ich nicht weiss, welche Datenbank du nutzt, kann ich dir da nicht 100% ein Beispiel geben.
Aber hier mal was aus Postgres:
Code: (dl )
1
2
3
4
5
CREATE TABLE daten (
id serial,
feld1 varchar NOT NULL,
feld2 integer NOT NULL,
changed timestamp DEFAULT 'now()' NOT NULL


So, damit hast du mal eine Tabelle mit ner fortlaufenden ID, 2 Feldern fuer Daten und das besagte Feld mit dem Zeitstempel.
Wenn du nun so Daten einfuegst, dann wird der Zeitstempel immer auf den Zeitpunkt des Einfuegens gesetzt:
Code: (dl )
INSERT INTO daten (feld1,feld2) VALUES('blafaselblubber',1234);


Du willst ja aber vorher pruefen, ob es schon den gleichen Datensatz, der innerhalb der letzten 30 Minuten eingetragen wurde gibt. Also pruefst du das vor dem INSERT:

Code: (dl )
SELECT id FROM daten WHERE feld1='blafaselblubber' AND feld2=1234 AND changed > now() - interval '30 minutes';

Wenn dieser SELECT was zurueckliefert, dann brauchst du den Datensatz nicht einfuegen, da er innerhalb der letzten 30 Minuten schon einmal eingefuegt wurde. Eventuell musst du das fuer deine Datenbank von der SQL-Syntax her etwas anpassen.

Also, nochmal zusammengepackt:
Code (perl): (dl )
1
2
3
4
5
#Pruefen ob Datensatz innerhalb der letzten 30 Minuten eingetragen wurde
unless ( $dbh->selectrow_array(qq{SELECT ... FROM ... WHERE ... AND changed > now() - interveral '30 minutes'})) {
  # ok, nix da, dann INSERT
  $dbh->do(qq{INSERT INTO ... (...) VALUES(...);
}
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-03-07 16:24.