Face à la nécessité de mettre à jour plusieurs lignes dans une base de données PostgreSQL, l'approche traditionnelle consiste à exécuter une instruction UPDATE distincte pour chaque rangée. Cependant, pour des raisons de performances, il est souvent souhaitable d'exécuter une seule instruction UPDATE pour mettre à jour plusieurs lignes en une seule fois.
Une méthode efficace pour la mise à jour groupée dans PostgreSQL consiste à utiliser une table dérivée. Cette technique consiste à créer une table temporaire avec les mises à jour souhaitées, puis à utiliser les données de cette table pour mettre à jour la table cible.
Considérez le scénario suivant dans lequel nous visons à mettre à jour plusieurs lignes de la table « table » avec de nouvelles valeurs des colonnes "column_a" et "column_b":
import ( "database/sql" _"github.com/jackc/pgx/v4/stdlib" // PostgreSQL driver ) func main() { db, err := sql.Open("pgx", "host=localhost port=5432 dbname=test user=postgres password=mysecretpassword") if err != nil { panic(err) } defer db.Close() // Prepare the derived table with updated values query := `UPDATE t SET column_a = v.column_a, column_b = v.column_b FROM (VALUES (1, 'FINISH', 1234), (2, 'UNFINISH', 3124) ) v(id, column_a, column_b) WHERE v.id = t.id;` _, err = db.Exec(query) if err != nil { panic(err) } // Optionally, you can verify the updated rows rows, err := db.Query("SELECT * FROM table WHERE id IN (1, 2)") if err != nil { panic(err) } defer rows.Close() for rows.Next() { var id int var columnA, columnB string if err := rows.Scan(&id, &columnA, &columnB); err != nil { panic(err) } fmt.Printf("ID: %d, Column A: %s, Column B: %s\n", id, columnA, columnB) } }
Cette approche offre une flexibilité dans l'ajout ou la suppression de lignes et de colonnes dans la table dérivée sans modifier la requête principale. Cela permet également d'éviter les erreurs accidentelles par rapport à la spécification explicite de plusieurs instructions UPDATE.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!