یک ردیف در یک DB اضافه کنید که از کلیدهای اصلی یا محدودیت های منحصر به فرد استفاده نمی کند

Summarize this content to 400 words in Persian Lang
در طول 7 سال کار خود به عنوان یک برنامه نویس، بیشتر اوقات از طریق یک ORM با SQL در تعامل بوده ام. یکی از ویژگی های ORM Eloquent لاراول که به نظر من بسیار مفید است، آن است updateOrInsert() روش:
DB::table(‘posts’)
->updateOrInsert(
[‘slug’ => ‘about’], // matching condition
[‘content’ => ‘Like and subscribe’] // created or updated values
);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در مثال بالا، Eloquent به دنبال یک ردیف در posts جدولی که در آن slug برابر است “about”. اگر ردیفی با آن اسلاگ وجود داشته باشد، Eloquent محتوای آن ردیف را به روز می کند “Like and subscribe”. اگر یک ردیف نمی کند با آن راب وجود داشته باشد، Eloquent یک ردیف جدید با اسلاگ از ایجاد می کند “about” و محتوای “Like and subscribe”.
مشکل: بدون کلید اولیه یا محدودیت های منحصر به فرد
من در حال حاضر در حال نوشتن یک اسکریپت مهاجرت برای انتقال داده های صفحه از یک سایت وردپرس قدیمی به یک سایت جدید وردپرس هستم. اسکریپت به پایگاه داده سایت قدیمی متصل می شود سپس یک فایل SQL ایجاد می کند که می تواند به پایگاه داده سایت جدید وارد شود. سایت جدید قبلاً دارای صفحاتی است که به صورت دستی منتقل شده اند، اما ممکن است محتوای آنها قدیمی باشد. وقتی صفحهای از قبل در سایت جدید وجود دارد، نمیخواهیم دوباره آن را ایجاد کنیم: میخواهیم صفحهای را که قبلاً آنجاست بهروزرسانی کنیم. با استفاده از عبارت می توانیم تعیین کنیم که آیا صفحه از قبل وجود دارد یا خیر post_name ستونی در پایگاه داده وردپرس، که مربوط به اسلاگ URL صفحه است.
اگر post_name کلید اصلی بودند، ما می توانستیم چیزی شبیه به Eloquent انجام دهیم createOrUpdate() روش با استفاده از a REPLACE بیانیه، اما post_name کلید اصلی نیست
اگر post_name یک محدودیت منحصر به فرد داشت، ما می توانستیم چیزی شبیه به Eloquent انجام دهیم createOrUpdate() روش با استفاده از یک INSERT … ON DUPLICATE KEY UPDATE بیانیه، اما post_name محدودیت منحصر به فرد ندارد.
آه، خوشی های وردپرس.
من به MySQL نگاه کردم IF بیانیه، اما IF دستور فقط در رویه ها، تریگرها و توابع ذخیره شده کار می کند. من نمی خواستم رویه های ذخیره شده را در فایل SQL ایجاد کنم که به پایگاه داده سایت جدید وارد کنم، بنابراین مجبور شدم گزینه های دیگری را جستجو کنم.
راه حل: 2 جمله
ساده ترین راه حلی که می توانستم برای تقلید از Eloquent پیدا کنم updateOrInsert()عملکرد SQL خالص این بود که مشکل را به دو بخش تقسیم کند:
هر ردیف موجود را با یک اسلاگ منطبق به روز کنید.
اگر ردیفی با راب منطبق وجود ندارد، یک ردیف جدید ایجاد کنید.
این چیزی است که در عمل به نظر می رسد:
— 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’
);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
توجه: این مثال بسیاری از موارد مورد نیاز وردپرس را حذف می کند wp_posts ستون ها برای اختصار و وضوح.
یادگیری در مورد INSERT … SELECT بیانیه برای من لحظه “آها” بود. در نظر گرفته شده است که از نتایج یک پرس و جو از یک جدول دیگر برای انجام چندین درج همزمان استفاده شود. با این حال، میتوانید از قابلیتهای SQL استفاده و سوءاستفاده کنید، با ارائه مقادیر خودتان و تنها زمانی که یک پست با post_name از “درباره” وجود ندارد.
آیا این ظریف ترین و کارآمدترین راه حل برای این مشکل است؟ احتمالا نه. اما برای انتقال یکباره یک سایت وردپرس به اندازه کافی خوب است و به شما امکان می دهد بدون نیاز به رویه های ذخیره شده یا هیچ منطق کاربردی یک ردیف را به روز کنید یا درج کنید. امیدواریم این پست به شما کمک کند تا بدون کمک ORM، پرس و جوهای قدرتمند بنویسید.
در طول 7 سال کار خود به عنوان یک برنامه نویس، بیشتر اوقات از طریق یک ORM با SQL در تعامل بوده ام. یکی از ویژگی های ORM Eloquent لاراول که به نظر من بسیار مفید است، آن است updateOrInsert()
روش:
DB::table('posts')
->updateOrInsert(
['slug' => 'about'], // matching condition
['content' => 'Like and subscribe'] // created or updated values
);
در مثال بالا، Eloquent به دنبال یک ردیف در posts
جدولی که در آن slug
برابر است "about"
. اگر ردیفی با آن اسلاگ وجود داشته باشد، Eloquent محتوای آن ردیف را به روز می کند "Like and subscribe"
. اگر یک ردیف نمی کند با آن راب وجود داشته باشد، Eloquent یک ردیف جدید با اسلاگ از ایجاد می کند "about"
و محتوای "Like and subscribe"
.
مشکل: بدون کلید اولیه یا محدودیت های منحصر به فرد
من در حال حاضر در حال نوشتن یک اسکریپت مهاجرت برای انتقال داده های صفحه از یک سایت وردپرس قدیمی به یک سایت جدید وردپرس هستم. اسکریپت به پایگاه داده سایت قدیمی متصل می شود سپس یک فایل SQL ایجاد می کند که می تواند به پایگاه داده سایت جدید وارد شود. سایت جدید قبلاً دارای صفحاتی است که به صورت دستی منتقل شده اند، اما ممکن است محتوای آنها قدیمی باشد. وقتی صفحهای از قبل در سایت جدید وجود دارد، نمیخواهیم دوباره آن را ایجاد کنیم: میخواهیم صفحهای را که قبلاً آنجاست بهروزرسانی کنیم. با استفاده از عبارت می توانیم تعیین کنیم که آیا صفحه از قبل وجود دارد یا خیر post_name
ستونی در پایگاه داده وردپرس، که مربوط به اسلاگ URL صفحه است.
اگر post_name
کلید اصلی بودند، ما می توانستیم چیزی شبیه به Eloquent انجام دهیم createOrUpdate()
روش با استفاده از a REPLACE
بیانیه، اما post_name
کلید اصلی نیست
اگر post_name
یک محدودیت منحصر به فرد داشت، ما می توانستیم چیزی شبیه به Eloquent انجام دهیم createOrUpdate()
روش با استفاده از یک INSERT ... ON DUPLICATE KEY UPDATE
بیانیه، اما post_name
محدودیت منحصر به فرد ندارد.
آه، خوشی های وردپرس.
من به MySQL نگاه کردم IF
بیانیه، اما IF
دستور فقط در رویه ها، تریگرها و توابع ذخیره شده کار می کند. من نمی خواستم رویه های ذخیره شده را در فایل SQL ایجاد کنم که به پایگاه داده سایت جدید وارد کنم، بنابراین مجبور شدم گزینه های دیگری را جستجو کنم.
راه حل: 2 جمله
ساده ترین راه حلی که می توانستم برای تقلید از Eloquent پیدا کنم updateOrInsert()
عملکرد SQL خالص این بود که مشکل را به دو بخش تقسیم کند:
- هر ردیف موجود را با یک اسلاگ منطبق به روز کنید.
- اگر ردیفی با راب منطبق وجود ندارد، یک ردیف جدید ایجاد کنید.
این چیزی است که در عمل به نظر می رسد:
-- 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'
);
توجه: این مثال بسیاری از موارد مورد نیاز وردپرس را حذف می کند
wp_posts
ستون ها برای اختصار و وضوح.
یادگیری در مورد INSERT ... SELECT
بیانیه برای من لحظه “آها” بود. در نظر گرفته شده است که از نتایج یک پرس و جو از یک جدول دیگر برای انجام چندین درج همزمان استفاده شود. با این حال، میتوانید از قابلیتهای SQL استفاده و سوءاستفاده کنید، با ارائه مقادیر خودتان و تنها زمانی که یک پست با post_name
از “درباره” وجود ندارد.
آیا این ظریف ترین و کارآمدترین راه حل برای این مشکل است؟ احتمالا نه. اما برای انتقال یکباره یک سایت وردپرس به اندازه کافی خوب است و به شما امکان می دهد بدون نیاز به رویه های ذخیره شده یا هیچ منطق کاربردی یک ردیف را به روز کنید یا درج کنید. امیدواریم این پست به شما کمک کند تا بدون کمک ORM، پرس و جوهای قدرتمند بنویسید.