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
Lepaskan: 2025-01-03 04:06:42
asal
409 orang telah melayarinya

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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.
...
Salin selepas log masuk

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;
Salin selepas log masuk

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
Salin selepas log masuk

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!

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