2016-09-02 1 views
2

Ich habe ein Skript überprüft immer, ob die Zeile existiert oder nicht, abhängig von der Anpassung an das Ereignis.SQL - Überprüfung der vorhandenen Daten

Zum Beispiel:

if(exists($row)){ 
    // update 
}else{ 
    // insert 
} 

Insert-Abfrage:

INSERT INTO table (name, value) VALUES 
    ('...', '1'), 
    ('...', '2'), 
    ('...', '3'), 
    ('...', '4'), 
    ('...', '5'), 
    //...100x 

UPDATE QUERY:

UPDATE table 
    SET value = CASE uuid 
     WHEN 'x' THEN 1 
     WHEN 'y' THEN 2 
    END, 
    SET value1 = CASE uuid 
     WHEN 'x' THEN 1 
     WHEN 'y' THEN 2 
    END 
    WHERE uuid IN ('x','y') 

Daten ist ziemlich viel, und stellen Sie sicher, dass der Datensatz lange genug existiert. Weil das Ausführen von 500x oder mehr erforderlich ist.

Exists-Methode:

SELECT id FROM table WHERE uuid=Y; 

Es gibt eine Möglichkeit, irgendwie das Skript beschleunigen? Sie können vorhandene Daten überprüfen, die direkt zur Abfrage hinzugefügt wurden.

Kann ich nur eine Abfrage CREATE + UPDATE + CHECK EXISTING haben?

Vielen Dank für Ihre Hilfe!

Updating and adding data with verification : 27-40 SEC 
Updating and adding data WITHOUT verification: 1-5 SEC 

EDIT: Ich bin immer Daten von einem anderen Server wie json Beispielskript:

$data = json_decode($_POST["data"]); 
foreach($data as value){ 
    // value is an array 
    if(exists($value["uuid"])){ 
     $this->appendUpdate($value); // building the update query 
    }else{ 
     $this->appendInsert($value); // building the insert query 
    } 
} 

    $this->insert(); // for example: 30 inserts in 1 query 
    $this->update(); // for example: 500 updates in 1 query 

In dieser Tabelle ist nur 300-2000 Zeilen (Ich verstehe nicht, warum es so lange dauert.)

EDIT2:

Dies ist wahrscheinlich meine Lösung:

INSERT INTO test (uuid, value) VALUES 
    ('aaa', 1), 
    ('bbb', 2), 
    ('ccc', 3) 
    ON DUPLICATE KEY UPDATE 
    value = (
     IF(uuid='aaa', 4, IF(uuid='bbb', 5, IF(uuid='ccc', 6, value))) 
    ); 

Ich werde versuchen, den flotten Server zu starten und dann berühren.

+0

Make Tabellenansicht mit select und dann einfügen, wenn Sie können. Nehmen Sie Daten aus der Datenbank selbst oder haben Sie lokale Daten vollständig? – Motsim

+0

Einfügen ignorieren ... auf doppelte Update-Sachen? – Jakumi

+0

fragen wurde aktualisiert @Motsim –

Antwort

2

Sicherstellen, dass die Spalte UUID einen eindeutigen Index hat, und Sie können

INSERT INTO table (a,b) VALUES (1,2) 
    ON DUPLICATE KEY UPDATE b=4; 
+0

Ich kann UUID nicht als Primärschlüssel verwenden, weil der Primärschlüssel 'ID' ist - UUID ist nur Primärschlüssel in einem anderen Server - nicht in meinem. –

+0

Ein eindeutiger Index ist etwas anderes als ein Primärschlüssel. Sie sind ziemlich ähnlich, aber Sie können mehrere eindeutige Indizes pro Tabelle haben, das sollte also kein Problem sein. – MarcHoH

+0

aaaaa hmmm es funktioniert wahrscheinlich jetzt (auf verschiedenen Testtabellen) Ich werde versuchen, es im echten Skript funktionieren zu lassen. @MarcHoH –

0

So etwas wie dies die folgende Abfrage tun:

INSERT INTO table(name,value) 
SELECT table2name as name, table2value as value FROM table2 
WHERE uuid IS NULL; 
Verwandte Themen