Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengendalikan Penghantaran Jenis NULL dalam Kemas Kini Berbilang Baris PostgreSQL?

Bagaimana untuk Mengendalikan Penghantaran Jenis NULL dalam Kemas Kini Berbilang Baris PostgreSQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-03 04:06:42416semak imbas

How to Handle NULL Type Casting in PostgreSQL Multi-Row Updates?

Mengirimkan NULL Type in Multi-Row Update

Dalam PostgreSQL, melaksanakan pertanyaan kemas kini pada berbilang baris boleh membawa kepada ralat apabila berurusan dengan NULL nilai jika jenis lajur tidak dihantar secara eksplisit. Artikel ini meneroka beberapa penyelesaian kepada isu ini, menyediakan pendekatan alternatif untuk memastikan penghantaran jenis yang betul semasa kemas kini berbilang baris.

Penyelesaian 1: Pilih Had 0 dengan NILAI dan KESATUAN SEMUA

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;

Kaedah ini menggabungkan pernyataan SELECT dengan LIMIT 0 untuk mendapatkan semula nama dan jenis lajur dan kemudian menambahkan baris data yang dikehendaki menggunakan operator UNION ALL. Baris pertama subquery memastikan bahawa jenis lajur yang sesuai ditakrifkan untuk baris berikutnya.

Penyelesaian 2: Pilih Had 0 dengan NILAI dan KESATUAN SEMUA PILIH

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;

Serupa dengan Penyelesaian 1, pendekatan ini menggunakan SELECT untuk mendapatkan jenis lajur dan kemudian menggunakan pernyataan SELECT individu untuk menambahkan data baris, menghalang sebarang pemutus jenis pramatang.

Penyelesaian 3: Ungkapan VALUES dengan Jenis Setiap Lajur

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.
...

Penyelesaian ini mentakrifkan jenis lajur dalam ungkapan VALUES itu sendiri , memastikan bahawa baris berikutnya dihantar ke jenis tersebut tanpa menghadapi sebarang ralat disebabkan oleh jenis automatik andaian.

Penyelesaian 4: Ungkapan NILAI dengan Jenis Baris

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;

Pendekatan ini menggunakan jenis baris jadual tertentu, membolehkan anda menghantar lajur ke yang betul menaip secara tersirat. Anda boleh mengakses nilai lajur individu menggunakan sintaks pemilihan medan.

Penyelesaian 5: Ungkapan NILAI dengan Jenis Baris Terurai

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

Serupa dengan Penyelesaian 4, tetapi menggunakan baris terurai untuk menentukan nilai data. Ini membolehkan anda menyediakan hanya lajur yang berkaitan, menghapuskan keperluan untuk mengetahui susunan lengkap dan jenis semua lajur dalam jadual.

Memilih penyelesaian terbaik bergantung pada faktor seperti prestasi, kemudahan dan ketersediaan maklumat tentang jenis lajur.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Penghantaran Jenis NULL dalam Kemas Kini Berbilang Baris 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