به‌روزرسانی (SQL)

دستور **به‌روزرسانی** (SQL **(UPDATE** داده‌های یک یا چند مدرک را در یک جدول تغییر می‌دهد. به شکلی که بتوان یا همه ردیف‌ها را به‌روزرسانی کرد، یا ممکن است یک زیرمجموعه با استفاده از یک شرط گزیده شود.

`UPDATE` به صورت زیر می‌باشد:

**<code>UPDATE</code>** *table_name* **<code>SET</code>** *column_name* = *value* [, *column_name* = *value ...*] [**<code>WHERE</code>** *condition*]

برای موفقیت‌آمیز بودن `UPDATE` ، کاربر باید امتیازات دستکاری داده‌ها (امتیاز `UPDATE`) را در جدول یا ستون داشته باشد و مقدار به‌روزشده لازم است که با هیچ‌یک از محدودیت‌های قابل اجرا (مانند کلیدهای اصلی، فهرست‌های منحصربه‌فرد، محدودیت‌های `CHECK` و محدودیت‌هایی که تهی نیستند، یعنی `NOT NULL`) تضاد نداشته باشد.

در برخی از پایگاه‌های داده، مانند PostgreSQL، زمانی که یک عبارت FROM وجود دارد، آنچه در اصل اتفاق می‌افتد این است که جدول هدف به جداول آورده‌شده در فهرست از لیست ملحق می‌شود و هر سطر خروجی از join یک عملیات به‌روزرسانی برای جدول هدف را به نمایش می‌گذارد. در زمان استفاده از FROM، باید اطمینان حاصل شود که join حداکثر یک ردیف خروجی برای هر ردیفی که نیاز به اصلاح دارد، تولید می‌کند. به عبارتی دیگر، یک ردیف هدف نباید به بیش از یک ردیف از جدول (های) دیگر اتصال پیدا کند. اگر این پیوند اتفاق بیفتد، تنها یکی از ردیف‌های پیوندشده برای به‌روزرسانی ردیف هدف مورداستفاده قرار می‌گیرد، اما اینکه کدام‌یک استفاده می‌شود را به‌آسانی نمی‌توان پیش‌بینی کرد.

به دلیل این بلاتکلیفی، ارجاع دادن به جداول دیگر فقط در انتخاب‌های فرعی ایمنی بیشتری دارد، اگرچه خواندن آن معمولاً سخت‌تر و کندتر از استفاده از join است.

MySQL با استاندارد ANSI تطابق ندارد.

## مثال‌ها
مقدار ستون *C1* در جدول *T* را فقط در ردیف‌هایی که مقدار ستون *C2 که "*a" است را روی ۱ تنظیم کنید.
```sql
UPDATE T
   SET C1 = 1
 WHERE C2 = 'a'
```


در جدول *T*، مقدار ستون *C1* را ۹ و مقدار *C3* را ۴ برای تمام ردیف‌هایی که مقدار ستون *C2 که "*a" است، تنظیم کنید.
```sql
UPDATE T
   SET C1 = 9,
       C3 = 4
 WHERE C2 = 'a'
```
افزایش ارزش ستون *C1* با ۱ اگر مقدار در ستون *C2 که "*a"است.
```sql
UPDATE T
   SET C1 = C1 + 1
 WHERE C2 = 'a'
```
مقدار *C1 را در ستون *C1 با رشته " text " وصل کنید اگر مقدار در ستون *C2 که "*a"است.
```sql
UPDATE T
   SET C1 = 'text' || C1
 WHERE C2 = 'a'
```
مقدار ستون *C1* را در جدول *T1* روی ۲ قرار دهید، تنها در صورتی که مقدار ستون *C2* در زیر لیست مقادیر ستون *C3* در جدول *T2* با ستون *C4* برابر با ۰ یافت شود.
```sql
UPDATE T1
   SET C1 = 2
 WHERE C2 IN ( SELECT C3
                 FROM T2
                WHERE C4 = 0)
```
همچنین می‌توان چندین ستون را در یک دستور update به‌روز کرد:
```sql
UPDATE T
   SET C1 = 1,
       C2 = 2
```
شرایط پیچیده و پیوستن نیز امکان‌پذیر است:
```sql
UPDATE T
   SET A = 1
 WHERE C1 = 1
   AND C2 = 2
```
برخی از پایگاه‌های داده اجازه استفاده غیر استاندارد از بند FROM را می‌دهند:
```sql
UPDATE a
   SET a.[updated_column] = updatevalue
  FROM articles a
       JOIN classification c
         ON a.articleID = c.articleID
 WHERE c.classID = 1
```
یا در سیستم‌های اوراکل (با فرض اینکه یک شاخص در طبقه‌بندی وجود دارد.articleID):
```sql
UPDATE
(
  SELECT *
    FROM articles
    JOIN classification
      ON articles.articleID = classification.articleID
   WHERE classification.classID = 1
)
SET [updated_column] = updatevalue
```
با نام طولانی جدول:
```sql
UPDATE MyMainTable AS a
SET a.LName = Smith
WHERE a.PeopleID = 1235
```


## مسائل بالقوه
مشکل هالووین ببینید. برای انواع خاصی از `update` اظهارات برای تبدیل شدن به یک حلقه بی‌نهایت وقتی که `where` بند و یک یا چند set بندها ممکن است از یک بند شاخص در هم تنیده استفاده کنند.

## منابع

رده:اس‌کیوال
رده:پایگاه داده‌ها
رده:کلیدواژه‌های اس‌کیوال