Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie eine Stapelaktualisierung von Daten in MySQL in PHP

So implementieren Sie eine Stapelaktualisierung von Daten in MySQL in PHP

不言
不言Original
2018-07-26 11:46:593647Durchsuche

Der Inhalt dieses Artikels befasst sich mit der stapelweisen Aktualisierung von Daten in MYSQL. Der Inhalt ist sehr detailliert. Ich hoffe, er kann Ihnen helfen.

In diesem Geschäft geht es darum, zwei Datentabellen zu aktualisieren. Dann werden Sie denken, dass es sehr einfach ist. Laden Sie einfach den Code hoch.

$sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";

Die Datentabelle heißt newhouse_clicks und hat vier Felder. Primärschlüssel-ID, Feld „Typ“ (Typ – Ganzzahl), Feld „Klicks“ (Klicks – Ganzzahl), Feld „update_time“ (Ganzzahl)
Gibt es damit wirklich kein Problem? Wenn Sie beispielsweise alle Immobilien in der aktuellen Stadt, beispielsweise Peking, stapelweise aktualisieren möchten und 1.000 Daten vorliegen, sollten Sie im Unternehmen wie folgt schreiben:

$data = array(id=>1,id=>2,..........id=>1000);//省略数据
foreach($data as $key=>$value) {
    $sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";
}

Dies erfordert mehrere Tabellen * 1.000 Daten. Wird es dann zu einer großen Verzögerung kommen?

Das Ergebnis ist ja, dass ihr Schreiben auf diese Weise zu einer Zeitüberschreitung des Servers geführt hat!

Wenn Sie mit Sprachen wie JAVA vertraut sind, sollten Sie wissen, dass JAVA die Funktion der internen Stapelaktualisierung von SQL bietet. Kann PHP das also als beste Sprache der Welt? Die Antwort ist ja!

Dann lernen wir die SQL-Anweisung für die Stapelaktualisierung.

UPDATE newhouse_clicks
    SET clicks = CASE id
        WHEN 1 THEN 1000
        WHEN 2 THEN 2000
        WHEN 3 THEN 3000
    END
WHERE id IN (1,2,3)

Haben Sie etwas Geduld, lassen Sie uns die Bedeutung dieser SQL-Anweisung im Detail erklären:
Aktualisieren Sie das Klickfeld in der Datentabelle newhouse_clicks. Wenn id=1, wird der Wert auf 1000 gesetzt, und wenn id= 2 ist auf 1000 gesetzt. Der Wert ist 2000. Bei id=3 ist der Wert auf 3000 gesetzt

Ist es also möglich, mehrere Felder zu aktualisieren? Natürlich können Sie den Code posten:

UPDATE newhouse_clicks
    SET clicks = CASE id
        WHEN 1 THEN 1000
        WHEN 2 THEN 2000
        WHEN 3 THEN 3000
    END,
    type = CASE id
        WHEN 1 THEN 1
        WHEN 2 THEN 6
        WHEN 3 THEN 8
    END
WHERE id IN (1,2,3)

Die Bedeutung dieser SQL-Anweisung besteht darin, das Feld „Klicks“ in der Datentabelle „newhouse_clicks“ zu aktualisieren. Bei id=1 wird der Wert auf 1000 gesetzt, bei id=2 , wird der Wert auf 2000 gesetzt, wenn id=3, setzen Sie den Wert auf 3000 und aktualisieren Sie das Typfeld. Wenn id=1, aktualisieren Sie das Typfeld auf 1. Wenn id=2, aktualisieren Sie das Typfeld auf 6. Wann id=3, aktualisieren Sie das Typfeld auf 8.
Kann PHP, die beste Sprache der Welt, nicht in der Lage sein, SQL zu buchstabieren?

//查询数据库返回的数据格式
$newhouse_clicks = array(
=> 2,
=> 3,
=> 8,
=> 9,
  );
$ids = implode(',', array_keys($newhouse_clicks ));
$sql = "UPDATE newhouse_clicks SET clicks = CASE id ";
foreach ( $newhouse_clicks as $key => $value) {
    $sql .= sprintf("WHEN %d THEN %d ", $key, $value);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;

Bitte überprüfen Sie, ob es mit unserer obigen SQL-Anweisung übereinstimmt!

Sind unsere tatsächlichen Daten also komplizierter? Sicher, je nach Fragestellung, ist das Format der Daten, die wir normalerweise aus der Datenbank entnehmen, so?

//查询数据库返回的数据格式
$newhouse_clicks = array(
=> array('clicks'=>1,'type'=>1,'update_time'=>time()),
=> array('clicks'=>2,'type'=>2,'update_time'=>time()),
=> array('clicks'=>3,'type'=>3,'update_time'=>time()),
=> array('clicks'=>4,'type'=>4,'update_time'=>time()),
);
?>

Was sollen wir also in dieser Situation tun?

da39b25861c68baa73de965ae2d0e688 array('clicks'=>1,'type'=>1,'update_time'=>time()),
=> array('clicks'=>2,'type'=>2,'update_time'=>time()),
=> array('clicks'=>3,'type'=>3,'update_time'=>time()),
=> array('clicks'=>4,'type'=>4,'update_time'=>time()),
);
    //获取所有的id
    $newhouse_clicks_keys = array_keys($newhouse_clicks);
    //拼接批量更新sql语句
    $sql = "UPDATE newhouse_clicks SET ";
    //合成sql语句
    foreach ($newhouse_clicks[1] as $key => $value) {
        $sql .= "{$key} = CASE id ";
        foreach ($newhouse_clicks as $newhouse_clicks_key=>$newhouse_clicks_value) {
 
            $sql .= sprintf("WHEN %d THEN %d ", $newhouse_clicks_key, $newhouse_clicks_value[$key]);
        }
        $sql .= "END, ";
    }
    //把最后一个,去掉
    $sql = substr($sql, 0, strrpos($sql,',')); 
    //合并所有id
    $ids = implode(',', $newhouse_clicks_keys);
    //拼接sql
    $sql .= " WHERE ID IN ({$ids})";
    echo $sql;

Eigentlich habe ich so viele Wörter geschrieben, nur um sie zu MySQL-Anweisungen zusammenzufügen.

Fertig! Ist die Geschwindigkeit nicht so sanft wie Seide?

Viele Programmierer, insbesondere Anfänger, geraten leicht in Missverständnisse und stecken den Datenabruf in SQL in eine for-Schleife. Das Schreiben wie dieses führt zu einem Problem, das zu einer ernsthaften Überlastung führt. Im wirklichen Leben gibt es ein solches Beispiel:

Sie arbeiten beispielsweise im 12. Stock und der Kurier ruft Sie an und bittet Sie, nach unten zu gehen Um den Express abzuholen (insgesamt 12 Stück), haben Sie zwei Möglichkeiten, den Express abzuholen:

1. Nehmen Sie den ersten Express, rennen Sie zurück in den 12. Stock, stellen Sie ihn weg und gehen Sie dann Den nächsten Express abholen, weglegen 12 Nach dem Schichten geht es weiter mit dem Abholen eines Expressversands.

2. Nehmen Sie alle Expresslieferungen auf einmal in die 12. Etage.

Jeder wird sich definitiv für die zweite Option entscheiden. Niemand wird dumm genug sein, 12 Mal zu rennen, um die Expresslieferung zu erhalten.

Der Computer basiert auf dem oben genannten Prinzip. Das Abrufen von Daten aus Ressourcen in einer for-Schleife ähnelt der ersten Lösung. Das Abrufen von Daten in Stapeln ähnelt der zweiten Lösung. (PS: Glauben Sie nicht, dass das Abrufen von Daten in MySQL ein solches Problem hat. Redis wird auch

ein solches Problem haben. Wie könnte es sonst eine Pipeline zum Abrufen von Batch-Daten geben? Das ist etwas, was ich (was bei Vorstellungsgesprächen häufig der Fall ist) wird definitiv zum Standard, um das technische Niveau einer Person zu messen.)

Verwandte Empfehlungen:

Was ist das Prinzip von mvc? PHP? Einführung in das MVC-Implementierungsprinzip von PHP (mit Code)

So laden Sie Dateien im PHP-Methodencode auf Qiniu hoch

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine Stapelaktualisierung von Daten in MySQL in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn