Masukkan baris dalam DB yang tidak menggunakan kunci utama atau kekangan unik

Linda Hamilton
Lepaskan: 2024-10-19 10:52:29
asal
256 orang telah melayarinya

Upsert a row in a DB that doesn

Sepanjang kerjaya saya selama 7 tahun sebagai pengaturcara, saya telah berinteraksi dengan SQL melalui ORM pada kebanyakan masa. Satu ciri daripada ORM Eloquent Laravel yang saya dapati amat berguna ialah kaedah updateOrInsert():

DB::table('posts')
    ->updateOrInsert(
        ['slug' => 'about'], // matching condition
        ['content' => 'Like and subscribe'] // created or updated values
    );
Salin selepas log masuk

Dalam contoh di atas, Eloquent akan mencari baris dalam jadual siaran di mana slug sama dengan "kira-kira". Jika baris wujud dengan slug itu, Eloquent akan mengemas kini kandungan baris itu kepada "Suka dan langgan". Jika baris tidak wujud dengan slug itu, Eloquent akan mencipta baris baharu dengan slug "tentang" dan kandungan "Suka dan langgan".

Masalahnya: tiada kunci utama atau kekangan unik

Saya sedang menulis skrip migrasi untuk memindahkan data halaman dari tapak WordPress lama ke tapak WordPress baharu. Skrip bersambung ke pangkalan data tapak lama kemudian mencipta fail SQL yang boleh diimport ke pangkalan data tapak baharu. Tapak baharu sudah mempunyai beberapa halaman yang telah dialihkan secara manual, tetapi kandungannya mungkin sudah lapuk. Apabila halaman sudah wujud di tapak baharu, kami tidak mahu menciptanya lagi: kami mahu mengemas kini halaman yang sudah ada. Kami boleh menentukan sama ada halaman itu sudah wujud dengan menggunakan lajur post_name dalam pangkalan data WordPress, yang sepadan dengan slug URL halaman.

Jika post_name ialah kunci utama, kita boleh mencapai sesuatu yang serupa dengan kaedah createOrUpdate() Eloquent menggunakan pernyataan REPLACE, tetapi post_name bukanlah kunci utama.

Jika post_name mempunyai kekangan unik, kami boleh mencapai sesuatu yang serupa dengan kaedah createOrUpdate() Eloquent menggunakan INSERT ... ON DUPLICATE KEY UPDATE statement, tetapi post_name tidak mempunyai kekangan unik.

Ah, kegembiraan WordPress.

Saya melihat pernyataan IF MySQL, tetapi pernyataan IF hanya berfungsi dalam prosedur tersimpan, pencetus dan fungsi. Saya tidak mahu mencipta prosedur tersimpan dalam fail SQL yang akan saya import ke pangkalan data tapak baharu, jadi saya terpaksa mencari pilihan lain.

Penyelesaian: 2 pernyataan

Penyelesaian paling mudah yang saya dapati untuk mencontohi kefungsian Eloquent's updateOrInsert() dalam SQL tulen ialah memecahkan masalah kepada dua bahagian:

  1. Kemas kini mana-mana baris sedia ada dengan slug yang sepadan.
  2. Buat baris baharu jika tiada baris dengan slug yang sepadan.

Begini rupanya dalam amalan:

-- Update the post if it already exists.

UPDATE wp_posts
SET post_type = 'page',
    post_title = 'About',
    post_content = 'Like and subscribe'
WHERE post_name = 'about';

-- Create a new post if it does not exist.

INSERT INTO wp_posts (post_name, post_type, post_title, post_content)
SELECT 'about', 'page', 'About', 'Like and subscribe'
WHERE NOT EXISTS (
    SELECT 1
    FROM wp_posts
    WHERE post_name = 'about'
);
Salin selepas log masuk

NOTA: Contoh ini menghilangkan banyak lajur wp_posts yang diperlukan oleh WordPress untuk ringkas dan jelas.

Mempelajari tentang INSERT ... SELECT pernyataan adalah detik "aha" untuk saya. Ia bertujuan untuk menggunakan hasil pertanyaan daripada jadual lain untuk melaksanakan banyak sisipan sekaligus. Walau bagaimanapun, anda boleh menggunakan dan menyalahgunakan keupayaan SQL dengan menyediakan nilai anda sendiri dan hanya melaksanakan sisipan apabila siaran dengan post_name "tentang" tidak wujud.

Adakah ini penyelesaian yang paling elegan dan cekap untuk masalah ini? Mungkin tidak. Tetapi ia cukup baik untuk penghijrahan sekali sahaja tapak WordPress, dan ia membolehkan anda mengemas kini atau memasukkan baris tanpa memerlukan prosedur tersimpan atau sebarang logik aplikasi. Semoga siaran ini membantu anda semasa anda menulis pertanyaan yang hebat tanpa bantuan ORM.

Atas ialah kandungan terperinci Masukkan baris dalam DB yang tidak menggunakan kunci utama atau kekangan unik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!