خانه/ تغییر داده‌ها/ UPDATE

UPDATE: تغییر مقدار ردیف‌های موجود

مبتدی ۱۳ دقیقه مطالعه

ساختار پایه

sql
UPDATE students
SET grade = 11
WHERE full_name = N'رضا کریمی';

بیا این را روی یک جدول کوچک امتحان کنیم:

امتحانش کن — UPDATE با WHERE
فقط پایه‌ی «رضا کریمی» عوض شد؛ «سارا نجفی» و «امیر رستمی» دست‌نخورده ماندند — چون WHERE دقیقاً مشخص کرد کدام ردیف باید تغییر کند.

⚠️ خطرناک‌ترین اشتباه: فراموش‌کردن WHERE

اگر WHERE را ننویسی، UPDATE بدون هیچ هشداری، همه‌ی ردیف‌های جدول را تغییر می‌دهد. این یکی از رایج‌ترین علت‌های واقعی خرابی داده در دنیای واقعی است. بیا این را — به‌صورت کاملاً امن، چون فقط در همین Playground موقت اتفاق می‌افتد — با چشم خودت ببینی:

امتحانش کن — UPDATE بدون WHERE (فقط برای دیدن خطر!)
هر سه دانش‌آموز پایه‌شان ۱۱ شد — حتی «امیر رستمی» که پایه‌ی ۹ داشت. در یک پایگاه‌داده‌ی واقعی با میلیون‌ها ردیف، همین یک خط فراموش‌شده می‌تواند فاجعه‌بار باشد.

روش امن: همیشه اول با SELECT پیش‌نمایش بگیر

یک عادت حرفه‌ای بسیار مهم: پیش از اجرای واقعیِ UPDATE، همان شرط WHERE را با یک SELECT امتحان کن تا ببینی دقیقاً کدام ردیف‌ها تحت‌تأثیر قرار می‌گیرند:

sql
-- قدم ۱: اول پیش‌نمایش بگیر
SELECT * FROM students WHERE grade = 9;

-- قدم ۲: اگر نتیجه درست بود، همان WHERE را در UPDATE هم بگذار
UPDATE students SET grade = 10 WHERE grade = 9;

به‌روزرسانی بر اساس مقدار فعلی

SET می‌تواند به مقدار فعلی همان ستون ارجاع بدهد — مثلاً برای اعمال تخفیف روی قیمت‌ها:

sql
-- ۱۰٪ تخفیف روی همه‌ی محصولات دسته‌ی «نوشت‌افزار»
UPDATE sales
SET price = price * 0.9
WHERE category = N'نوشت‌افزار';

بیا امتحان کنیم:

امتحانش کن — تخفیف با ارجاع به مقدار فعلی

به‌روزرسانی بر اساس یک جدول دیگر (UPDATE ... FROM)

گاهی مقداری که باید در ستونی بگذاری، از یک جدول دیگر می‌آید — مثلاً قیمت‌های تازه‌ای که در یک جدول موقت (Staging) آماده شده‌اند. برای این کار از UPDATE ... FROM استفاده می‌شود:

sql
-- در SQL Server واقعی:
UPDATE p
SET p.price = s.new_price
FROM products p
INNER JOIN price_updates s ON p.id = s.product_id;
نکته‌ی نحوی: SQLite هم از UPDATE ... FROM پشتیبانی می‌کند، اما با نحوی کمی متفاوت — بدون تکرار جدول هدف در FROM، و شرط اتصال در WHERE نوشته می‌شود، نه ON:
sql
-- معادل در SQLite (همین Playground):
UPDATE products
SET price = price_updates.new_price
FROM price_updates
WHERE products.id = price_updates.product_id;

بیا امتحان کنیم:

امتحانش کن — به‌روزرسانی از روی یک جدول دیگر
فقط «کیبورد» که در price_updates یک ردیف مطابق داشت، قیمتش تغییر کرد؛ «ماوس» که در جدول موقت نبود، دست‌نخورده ماند. این دقیقاً همان الگویی است که در درس بعدی (MERGE) کامل‌تر می‌شود.

جمع‌بندی این درس

  • UPDATE table SET col = value WHERE condition; فقط ردیف‌های منطبق با WHERE را تغییر می‌دهد.
  • هرگز UPDATE بدون WHERE اجرا نکن، مگر این‌که واقعاً بخواهی همه‌ی ردیف‌ها تغییر کنند.
  • عادت کن پیش از UPDATE، همان شرط را با SELECT پیش‌نمایش بگیری.
  • SET col = col ± value برای تغییر بر اساس مقدار فعلی همان ستون کاربرد دارد.
  • UPDATE ... FROM اجازه می‌دهد مقدار جدید از یک جدول دیگر بیاید؛ نحو SQL Server و SQLite کمی متفاوت است.

در درس بعدی سراغ DELETE می‌رویم — با همان احتیاطی که همین حالا درباره‌ی WHERE یاد گرفتیم، این‌بار برای حذف ردیف.