Rumah >pangkalan data >tutorial mysql >Bagaimana Mengemas kini Berbilang Baris dengan Cekap dengan Nilai NULL dalam PostgreSQL?

Bagaimana Mengemas kini Berbilang Baris dengan Cekap dengan Nilai NULL dalam PostgreSQL?

Barbara Streisand
Barbara Streisandasal
2024-12-30 19:39:10876semak imbas

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

Cabaran Mengemas kini Berbilang Baris dengan Nilai NULL

Dalam PostgreSQL, mengemas kini berbilang baris secara serentak boleh menghadapi cabaran apabila berurusan dengan nilai NULL. Apabila bekerja dengan ungkapan VALUES kendiri, PostgreSQL kekurangan maklumat tentang jenis data. Akibatnya, penghantaran eksplisit diperlukan untuk literal bukan angka, termasuk nilai NULL.

Menghantar Nilai NULL dalam Pertanyaan Kemas Kini

Untuk mengatasi isu ini, terokai penyelesaian berikut:

1. Subquery dengan 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;
  • Kebaikan: Overhed minimum, ringkas dan pantas, memerlukan pengetahuan tentang nama lajur yang berkaitan
  • Kontra: Resolusi jenis boleh gagal untuk sesetengah jenis data

2. Subkueri dengan LIMIT 0 dan 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;
  • Kebaikan: Mengelakkan kegagalan peleraian jenis
  • Keburukan: Sintaks verbose setiap baris, lebih perlahan daripada ungkapan VALUES untuk senarai panjang

3. Ungkapan VALUES dengan Jenis Setiap Lajur

...
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.
...
  • Kebaikan: Biasanya lebih cepat daripada #2, sintaks pendek untuk lajur yang berkaitan, pengetahuan tentang nama lajur yang berkaitan sahaja diperlukan
  • Keburukan: Sintaks bertele-tele untuk beberapa baris, kurang boleh dibaca

4. Ungkapan VALUES dengan Jenis Baris

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;
  • Kebaikan: Sintaks terpantas, terpendek untuk beberapa baris dan semua lajur, tidak perlu menyatakan nama lajur
  • Keburukan: Sintaks tidak terkenal, memerlukan pengetahuan tentang bilangan dan kedudukan lajur yang berkaitan dalam susunan lalai

5. Ungkapan VALUES dengan Jenis Baris Terurai

...
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)
...
  • Kebaikan dan keburukan serupa dengan #4, tetapi dengan sintaks yang lebih dikenali

Atas ialah kandungan terperinci Bagaimana Mengemas kini Berbilang Baris dengan Cekap dengan Nilai NULL dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn