Heim >Datenbank >MySQL-Tutorial >Wie gehe ich mit der NULL-Typumwandlung in mehrzeiligen PostgreSQL-Updates um?
Umwandeln des NULL-Typs in mehrzeilige Aktualisierungen
In PostgreSQL kann die Ausführung einer Aktualisierungsabfrage für mehrere Zeilen zu Fehlern beim Umgang mit NULL führen Werte, wenn die Spaltentypen nicht explizit umgewandelt werden. In diesem Artikel werden mehrere Lösungen für dieses Problem untersucht und alternative Ansätze bereitgestellt, um eine ordnungsgemäße Typumwandlung bei mehrzeiligen Aktualisierungen sicherzustellen.
Lösung 1: Wählen Sie Limit 0 mit VALUES und UNION ALL
UPDATE foo f SET x = t.x , y = t.y FROM ( (SELECT pkid, x, y FROM foo LIMIT 0) -- Get column types UNION ALL VALUES (1, 20, NULL) -- No type casts , (2, 50, NULL) ) t -- Column names and types defined WHERE f.pkid = t.pkid;
Diese Methode kombiniert eine SELECT-Anweisung mit einem LIMIT von 0, um Spaltennamen und -typen abzurufen, und hängt dann die gewünschten Datenzeilen mithilfe des UNION ALL-Operators an. Die erste Zeile der Unterabfrage stellt sicher, dass die entsprechenden Spaltentypen für die nachfolgenden Zeilen definiert werden.
Lösung 2: Wählen Sie Limit 0 mit VALUES und UNION ALL SELECT
UPDATE foo f SET x = t.x , y = t.y FROM ( (SELECT pkid, x, y FROM foo LIMIT 0) -- Get column types UNION ALL SELECT 1, 20, NULL UNION ALL SELECT 2, 50, NULL ) t -- Column names and types defined WHERE f.pkid = t.pkid;
Ähnlich wie Lösung 1 verwendet dieser Ansatz SELECT, um Spaltentypen abzurufen, und verwendet dann einzelne SELECT-Anweisungen, um Datenzeilen anzuhängen, wodurch ein vorzeitiger Typ verhindert wird Casting.
Lösung 3: VALUES-Ausdruck mit spaltenspezifischem Typ
UPDATE foo f SET x = t.x , y = t.y FROM ( VALUES ((SELECT pkid FROM foo LIMIT 0) , (SELECT x FROM foo LIMIT 0) , (SELECT y FROM foo LIMIT 0)) -- Get type for each col individually , (1, 20, NULL) , (2, 50, NULL) ) t (pkid, x, y) -- Columns names not defined yet, only types. ...
Diese Lösung definiert die Spaltentypen innerhalb des VALUES-Ausdrucks selbst und stellt sicher, dass die nachfolgenden Zeilen werden in diese Typen umgewandelt, ohne dass aufgrund automatischer Typannahmen Fehler auftreten.
Lösung 4: VALUES-Ausdruck mit Zeilentyp
UPDATE foo f SET x = (t.r).x -- Parenthesis for unambiguous syntax , y = (t.r).y FROM ( VALUES ('(1,20,)'::foo) -- Columns need to be in table default order ,('(2,50,)') -- Nothing after last comma for NULL ) t (r) -- Column name for row type WHERE f.pkid = (t.r).pkid;
Dieser Ansatz verwendet den Zeilentyp der spezifischen Tabelle, sodass Sie Spalten implizit in die richtigen Typen umwandeln können. Sie können mithilfe der Feldauswahlsyntax auf einzelne Spaltenwerte zugreifen.
Lösung 5: VALUES-Ausdruck mit zerlegtem Zeilentyp
UPDATE foo f SET x = t.x , y = t.y FROM ( VALUES (('(1,20,)'::foo).*) -- Decomposed row of values , (2, 50, NULL) ) t(pkid, x, y) -- Arbitrary column names (match table columns) WHERE f.pkid = t.pkid; -- Eliminates 1st row with NULL values
Ähnlich wie Lösung 4, jedoch mit zerlegten Zeilen um Datenwerte anzugeben. Dadurch können Sie nur die relevanten Spalten bereitstellen und müssen nicht die vollständige Reihenfolge und die Typen aller Spalten in der Tabelle kennen.
Die Auswahl der besten Lösung hängt von Faktoren wie Leistung, Komfort und Verfügbarkeit ab Informationen zu Spaltentypen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit der NULL-Typumwandlung in mehrzeiligen PostgreSQL-Updates um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!