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!