📚 فصل ۱۵ — بهروزرسانی دادهها (UPDATE) در SQL Server
1️⃣ مقدمه — چرا دستور UPDATE حیاتی است؟
پایگاه دادههای ما ایستا و بدون تغییر باقی نمیمانند.
در دنیای واقعی، دادهها مدام تغییر میکنند:
- شماره تماس مشتریان بهروزرسانی میشود.
- آدرسها عوض میشوند.
- قیمت محصولات در واکنش به تورم یا تخفیف تغییر میکند.
- وضعیت سفارشها (پرداختشده، ارسالشده، لغوشده) تغییر پیدا میکند.
- خطاهای انسانی در ورود اطلاعات باید اصلاح شوند.
💡 UPDATE ابزار اصلی این تغییرات است.
با این دستور، میتوانیم رکوردهای خاصی را بدون حذف، بهروزرسانی کنیم.
📌 مثال واقعی:
- مشتری “علی رضایی” تلفن خود را تغییر داده → باید فقط شماره همین مشتری تغییر کند، نه کل جدول.
- موجودی یک محصول تغییر کرده → باید ستون موجودی همان محصول تغییر کند.
2️⃣ مفهوم کلی دستور UPDATE
در T-SQL، دستور UPDATE ساختار زیر را دارد:
UPDATE TableName
SET Column1 = NewValue,
Column2 = AnotherValue,
...
WHERE Condition;
اجزای دستور:
- UPDATE TableName → انتخاب جدول مقصد
- SET → تعیین ستونهایی که باید تغییر کنند و مقدار جدیدشان
- WHERE → تعیین سطرهایی که باید آپدیت شوند (شرط تغییر)
3️⃣ اهمیت شرط WHERE — خطری که دیتابیس را نابود میکند 😱
اگر شرط WHERE را فراموش کنید:
UPDATE Customers
SET City = N'تهران';
📛 این دستور همه مشتریان را به شهر تهران منتقل میکند (از دید دادهای).
بنابراین:
- همیشه قبل از اجرای UPDATE، با همان شرط یک SELECT تستی بزنید:
SELECT *
FROM Customers
WHERE City = N'اصفهان';
اگر نتایج درست بود، آنوقت دستور UPDATE را اجرا کنید.
4️⃣ بهروزرسانی یک ستون
UPDATE Customers
SET Phone = '09120001122'
WHERE CustomerID = 5;
📌 این دستور فقط شماره تلفن مشتری با CustomerID = 5
را تغییر میدهد.
5️⃣ بهروزرسانی چند ستون همزمان
UPDATE Customers
SET City = N'مشهد',
Phone = '09125556677'
WHERE CustomerID = 8;
💡 همه ستونهای ذکر شده در قسمت SET بهطور همزمان بهروزرسانی میشوند.
6️⃣ اعمال عملیات ریاضی در UPDATE
UPDATE Products
SET Price = Price * 1.10 -- افزایش ۱۰ درصدی قیمت
WHERE CategoryID = 3;
📌 مقدار ستون Price
بر اساس مقدار فعلی خود محاسبه و تغییر داده میشود.
کاربردها:
- افزایش / کاهش قیمتها
- تغییر موجودیها
- محاسبه هزینه جدید بر اساس مالیات یا تخفیف
7️⃣ استفاده از توابع داخلی در UPDATE
مثال متنی:
UPDATE Customers
SET FullName = UPPER(FullName)
WHERE City = N'اصفهان';
→ نام همه مشتریان اصفهان به حروف بزرگ تغییر میکند.
مثال تاریخی:
UPDATE Orders
SET OrderDate = GETDATE()
WHERE OrderID = 120;
→ تاریخ سفارش شماره 120 به امروز تغییر میکند.
8️⃣ آپدیت بر اساس داده جدول دیگر (UPDATE + JOIN)
گاهی اطلاعات جدید در یک جدول دیگر است و باید جدول اصلی با آن بهروزرسانی شود:
UPDATE p
SET p.Price = pl.NewPrice
FROM Products AS p
JOIN PriceList AS pl
ON p.ProductID = pl.ProductID;
📌 این روش در پروژههای واقعی خیلی پرکاربرد است:
- همگامسازی قیمتها با لیست قیمت جدید
- تغییر وضعیت سفارشها بر اساس داده جدول لاجستیک
9️⃣ بهروزرسانی مقادیرNULL
گاهی ستونها مقدارNULL دارند و باید مقدار پیشفرض بگیرند:
UPDATE Customers
SET Phone = N'نامشخص'
WHERE Phone IS NULL;
🔟 آپدیت مشروط با چند شرط
UPDATE Orders
SET Status = N'ارسال شده'
WHERE Status = N'در حال پردازش'
AND OrderDate < '2025-09-01';
📌 شرطهای چندگانه باید با AND
یا OR
ترکیب شوند.
1️⃣1️⃣ محدودکردن تعداد رکوردهای آپدیت (TOP)
SQL Server اجازه میدهد تعداد رکوردهای آپدیت را محدود کنید:
UPDATE TOP (10) Customers
SET City = N'قزوین'
WHERE City = N'همدان';
📌 معمولاً همراه با ORDER BY شبیهسازی میشود (ولی نیاز به روشهای دیگر دارد، چون باعث پیام خطا میشود که ORDER BY مستقیم پشتیبانی نمیشود).
1️⃣2️⃣ اشتباهات رایج در UPDATE
❌ فراموشی WHERE → تغییر کل جدول
❌ اشتباه املایی در نام ستون
UPDATE Customers
SET Phon = '0912' -- ستون غلط
❌ تغییر کلید اصلی بدون هماهنگی با Foreign Key
ممکن است باعث شکستن روابط بین جداول شود.
❌ بهروزرسانی در دیتابیس عملیاتی بدون تست
حتماً قبلش روی محیط تست کار کنید.
1️⃣3️⃣ نکات حرفهای UPDATE
a) استفاده از تراکنشها
BEGIN TRAN;
UPDATE Customers
SET City = N'کرج'
WHERE City = N'کرج قدیم';
-- بررسی نتایج
SELECT * FROM Customers WHERE City = N'کرج';
COMMIT TRAN; -- یا ROLLBACK TRAN;
b) لاگکردن تغییرات
قبل از آپدیت، داده قبلی را در یک جدول پشتیبان ذخیره کنید.
c) قفلگذاری
در آپدیتهای سنگین از HINT ها استفاده کنید مثل WITH (ROWLOCK)
برای کاهش قفلهای بزرگ.
1️⃣4️⃣ سناریوهای واقعی پروژهای
سناریو ۱ — اصلاح شماره تماس مشتریان
UPDATE Customers
SET Phone = 'بدون شماره'
WHERE Phone IS NULL;
سناریو ۲ — اعمال تخفیف روی محصولات قدیمی
UPDATE Products
SET Price = Price * 0.80
WHERE DATEDIFF(MONTH, LastStockDate, GETDATE()) > 12;
سناریو ۳ — بهروزرسانی وضعیت سفارشها بر اساس تحویل
UPDATE o
SET o.Status = N'تحویل شده'
FROM Orders o
JOIN Deliveries d
ON o.OrderID = d.OrderID
WHERE d.ReceivedDate IS NOT NULL;
1️⃣5️⃣ تمرینهای عملی
- شماره موبایل مشتری “علی محمدی” را به 09123334455 تغییر دهید.
- قیمت همه محصولات دسته “پوشاک” را 15٪ افزایش دهید.
- برای مشتریان بدون ایمیل، مقدار ایمیل را برابر
unknown@example.com
قرار دهید. - وضعیت تمام سفارشهای “در حال پردازش” قبل از شهریور ۱۴۰۴ را به “ارسال شده” تغییر دهید.
- قیمت محصولاتی که بیش از ۲ سال است در انبار هستند را ۳۰٪ کاهش دهید.
1️⃣6️⃣ جمعبندی
در این فصل یاد گرفتید:
- دستور UPDATE و ساختار آن
- اهمیت WHERE و خطرات حذف آن
- تغییر یک یا چند ستون
- انجام محاسبات و استفاده از توابع
- آپدیت با JOIN از جدول دیگر
- اصلاح مقادیر NULL
- خطاهای رایج
- نکات امنیتی و حرفهای
- سناریوهای واقعی و تمرینهای عملی