Rumah pangkalan data tutorial mysql Masukkan baris dalam DB yang tidak menggunakan kunci utama atau kekangan unik

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

Oct 19, 2024 am 10:52 AM

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!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kurangkan penggunaan memori MySQL di Docker Kurangkan penggunaan memori MySQL di Docker Mar 04, 2025 pm 03:52 PM

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Mar 19, 2025 pm 03:51 PM

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Mar 04, 2025 pm 04:01 PM

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif Apa itu SQLite? Gambaran Keseluruhan Komprehensif Mar 04, 2025 pm 03:55 PM

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Mar 04, 2025 pm 03:54 PM

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Mar 04, 2025 pm 03:49 PM

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Mar 18, 2025 pm 12:00 PM

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)?

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Mar 18, 2025 pm 12:01 PM

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL?

See all articles