94451
Goto Top

Komplettes Array in MySQL Datenbank

Hallo ihr,

ich habe ein multidiemensionales Array das ich in eine MySQL Datenbank übernehmen möchte, vorhandene Datensätze möchte ich aber nicht überschreiben!

mein Array sieht ca. so aus!

Array
(
     => Array
        (
             => 345
            [1] => 3241
        )

    [1] => Array
        (
             => 234
            [1] => 34561
        )

    [2] => Array
        (
             => 1234 
            [1] => 13245 
        )

...

    [854] => Array
        (
             => 345
            [1] => 1234
        )
)

jetzt möchte ich das Array in eine MySQL Datenbank eintragen!

die Datenbank sieht so aus!

FELD1  | FELD2  | FELD3  | Datum
1234   | 13245  | 500    | 17.06.2012
jetzt möchte ich alle Werte eintragen! Als Feld3 wird ein (immergleicher) fester Wert eingetragen! Datum soll das jetzige eingetragen werden!

sollte ein Datensatz (Feld1, Feld2) => (Array[x], Array[x][1]) bereits vorhanden sein, sollte dieser ausgelassen werden!

whileschleife mit Array{

INSERT INTO tabelle (FELD1, FELD2, FELD3, Datum) VALUES (Array[x], Array[x][1], 100, jetzt)

}

Das sollte so annähernd Funktionieren!

Was mir aber jetzt fehlt:
1. wie prüfe ich ob Feld1 und Feld2 bereits mit gleichen Daten vorhanden sind? -> nur wenn beide gleich sind darf kein eintrag gemacht werden!
2. ist eine whileschleife sinnvoll? bei 800 Datensätze stell ich mir das sehr rechenintensiv vor!

Danke

Content-Key: 186901

Url: https://administrator.de/contentid/186901

Printed on: April 18, 2024 at 11:04 o'clock

Member: LianenSchwinger
LianenSchwinger Jun 22, 2012 at 09:30:46 (UTC)
Goto Top
Hallo,

folgendes müsste funktionieren

INSERT INTO tabelle (feld1, feld2, feld3, datum)
    SELECT Array[x], Array[x][1], 100, jetzt FROM dual
    WHERE NOT EXISTS (SELECT * FROM tabelle
                      WHERE feld1 = Array[x] AND feld2 = Array[x][1]);

Davon ab könnte auch Dein obiges INSERT klappen. Wenn feld1 und feld2 als Primary-Key definiert sind dürfte eigentlich kein INSERT mit der gleichen Kombination möglich sein.

Gruß Jörg
Member: nxclass
nxclass Jun 22, 2012 updated at 12:19:17 (UTC)
Goto Top
.. hatten wir das nicht erst, dass ein SELECT auf eine beim INSERT/UPDATE/DELETE gesperrte Tabelle (wenn MyISAM) nicht geht ?

Wenn feld1 und feld2 als Primary-Key definiert sind
dann reicht ein
INSERT IGNORE INTO ...
.. am sichersten ist natürlich einfach vorher ein SELECT zu machen.
Member: LianenSchwinger
LianenSchwinger Jun 22, 2012 at 12:53:48 (UTC)
Goto Top
Hallo nxclass,

stimmt wenn MyISAM hatten wir das gerade face-smile

Ich werde mir mal die Doku für MySQL runterladen. Zu Oracle scheint es da doch einige Unterschiede zu geben.

Gruß Jörg
Member: nxclass
nxclass Jun 24, 2012 at 11:14:47 (UTC)
Goto Top
ist die Frage gelöst ?

zu 2.
800 Datensätze sind echt kein Ding. Wenn du noch das letzte raus holen willst, dann erstelle für das INSERT (und das SELECT) jeweils ein prepared Statement und arbeite in der while Schleife nur noch mit den Parametern.
Mitglied: 94451
94451 Jun 25, 2012 updated at 08:09:45 (UTC)
Goto Top
Zitat von @nxclass:
ist die Frage gelöst ?

noch nicht! Liegt aber daran das ich mich noch nicht drüber gemacht habe!

Falls noch Probleme sind werde ich hier schreiben, falls nicht als gelöst markieren!

was mir grad noch so einfällt:
-> ich mache einen Abruf aus einer OracleSQL Tabelle in das besagte Array! Und trage diese (Dann in die MySQL Tabelle ein -> allerdings nicht den Kompletten Datensatz sondern nur -> Nichtvorhandene IDs und nicht alle Spalten)

geht das effizienter als:
Abruf (Oracle SQL) -> Array
Array -> Eintrag (MySQL)?

-> weil das ganze laden bei aktuellen 900 Datensätze (ständig wachsend) doch ~30 Sekunden dautert ... (könnte auch an den datenleitungen/auslastung liegen bei uns im netzwerk -> aber gerade deswegen ist der effiziensteste weg mir wichtig!)

Vielen Dank
Member: nxclass
nxclass Jun 25, 2012 at 14:10:59 (UTC)
Goto Top
geht das effizienter als:
Ein export / import direkt auf den Servern sollte da am schnellsten gehen. Wenn dies öfters gemacht werden muss könnte man versuchen ein Shell Skript zu schreiben.