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
Lepaskan: 2024-12-30 19:39:10
asal
840 orang telah melayarinya

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;
Salin selepas log masuk
  • 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;
Salin selepas log masuk
  • 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.
...
Salin selepas log masuk
  • 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;
Salin selepas log masuk
  • 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)
...
Salin selepas log masuk
  • 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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan