Heim > Datenbank > MySQL-Tutorial > Wie aktualisiere ich effizient mehrere Zeilen mit NULL-Werten in PostgreSQL?

Wie aktualisiere ich effizient mehrere Zeilen mit NULL-Werten in PostgreSQL?

Barbara Streisand
Freigeben: 2024-12-30 19:39:10
Original
849 Leute haben es durchsucht

How to Efficiently Update Multiple Rows with NULL Values in PostgreSQL?

Herausforderungen beim Aktualisieren mehrerer Zeilen mit NULL-Werten

In PostgreSQL kann das gleichzeitige Aktualisieren mehrerer Zeilen beim Umgang mit NULL-Werten zu Herausforderungen führen. Beim Arbeiten mit eigenständigen VALUES-Ausdrücken fehlen PostgreSQL Informationen zu Datentypen. Daher ist für nicht numerische Literale, einschließlich NULL-Werte, eine explizite Umwandlung erforderlich.

Umwandlung von NULL-Werten in Aktualisierungsabfragen

Um dieses Problem zu lösen, erkunden Sie die folgenden Lösungen:

1. Unterabfrage mit LIMIT 0

UPDATE foo SET x=t.x, y=t.y FROM
(
  (SELECT pkid, x, y FROM foo LIMIT 0)
   UNION ALL
   VALUES
      (1, 20, NULL)  -- no type casts here
    , (2, 50, NULL)
   ) t               -- column names and types are already defined
WHERE  f.pkid = t.pkid;
Nach dem Login kopieren
  • Vorteile: Minimaler Overhead, einfach und schnell, erfordert Kenntnisse der relevanten Spaltennamen
  • Nachteil: Die Typauflösung kann bei einigen Datentypen fehlschlagen

2. Unterabfrage mit LIMIT 0 und SELECT

UPDATE foo SET x=t.x, y=t.y FROM
(
  (SELECT pkid, x, y FROM foo LIMIT 0)
   UNION ALL SELECT 1, 20, NULL
   UNION ALL SELECT 2, 50, NULL
   ) t               -- column names and types are already defined
WHERE  f.pkid = t.pkid;
Nach dem Login kopieren
  • Vorteile: Vermeidet Fehler bei der Typauflösung
  • Nachteile: Ausführliche Syntax pro Zeile, langsamer als der VALUES-Ausdruck für lange Listen

3. VALUES-Ausdruck mit spaltenspezifischem Typ

...
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.
...
Nach dem Login kopieren
  • Vorteile: Normalerweise schneller als #2, kurze Syntax für relevante Spalten, Kenntnis nur relevanter Spaltennamen erforderlich
  • Nachteile: Ausführliche Syntax für wenige Zeilen weniger lesbar

4. VALUES-Ausdruck mit Zeilentyp

UPDATE foo f
SET x = (t.r).x         -- parenthesis needed to make syntax unambiguous
  , y = (t.r).y
FROM (
   VALUES
      ('(1,20,)'::foo)  -- columns need to be in default order of table
     ,('(2,50,)')       -- nothing after the last comma for NULL
   ) t (r)              -- column name for row type
WHERE  f.pkid = (t.r).pkid;
Nach dem Login kopieren
  • Vorteile: Schnellste und kürzeste Syntax für wenige Zeilen und alle Spalten, keine Angabe von Spaltennamen erforderlich
  • Nachteile: Nicht bekannte Syntax, erfordert Kenntnisse über die Anzahl und Position relevanter Spalten in der Standardreihenfolge

5. VALUES-Ausdruck mit zerlegtem Zeilentyp

...
FROM (
   VALUES
      ((NULL::foo).*)  -- decomposed row of values
    , (1, 20, NULL)    -- uniform syntax for all
    , (2, 50, NULL)
   ) t(pkid, x, y)  -- arbitrary column names (I made them match)
...
Nach dem Login kopieren
  • Vor- und Nachteile ähnlich wie #4, aber mit allgemeiner bekannter Syntax

Das obige ist der detaillierte Inhalt vonWie aktualisiere ich effizient mehrere Zeilen mit NULL-Werten in PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage