Мэдээлэл шинэчлэх (UPDATE)
Өгөгдлийн санд хадгалсан мэдээлэл өөрчлөгддөг — хэрэглэгчийн нас нэмэгдэх, бүтээгдэхүүний үнэ өөрчлөгдөх, захиалгын статус шинэчлэгдэх зэрэг. UPDATE команд нь одоо байгаа бичлэгийн утгыг өөрчилдэг SQL-ийн гол командуудын нэг юм.
Үндсэн UPDATE хэлбэр
UPDATE хүснэгт
SET багана1 = утга1, багана2 = утга2
WHERE нөхцөл;
Чухал анхааруулга: WHERE мартвал хүснэгтийн БҮГД бичлэг өөрчлөгдөнө! Үргэлж WHERE нөхцөл тавина.
-- Нэг хэрэглэгчийн насыг шинэчлэх
UPDATE users
SET нас = 26
WHERE id = 1;
Олон баганыг нэгэн зэрэг шинэчлэх
SET-д таслалаар тусгаарлан олон баганыг нэг удаа шинэчлэх боломжтой:
UPDATE users
SET
нэр = 'Болд Баатар',
нас = 26,
утас = '99001122'
WHERE id = 1;
Шинэчилсэн бичлэгийг шуурхай авахад RETURNING ашиглана:
UPDATE users
SET нас = 26
WHERE id = 1
RETURNING id, нэр, нас;
id | нэр | нас
----+--------------+-----
1 | Болд Баатар | 26
Одоогийн утган дээр тулгуурлах
Шинэ утгыг тооцоолохдоо одоогийн баганын утгыг ашиглаж болно:
-- Харагдсан тоог 1-ээр нэмэх
UPDATE posts
SET харагдсан = харагдсан + 1
WHERE id = 5;
-- Бүх бараанд 10% үнийн өсгөлт
UPDATE products
SET үнэ = үнэ * 1.10;
-- XP-г нэмэх
UPDATE profiles
SET xp = xp + 10
WHERE user_id = 42;
WHERE нөхцөлтэй шинэчлэх
Олон нөхцөл хослуулж зөвхөн хэрэгтэй бичлэгүүдийг шинэчилнэ:
-- Хугацаа хэтэрсэн захиалгуудын статусыг өөрчлөх
UPDATE orders
SET статус = 'cancelled'
WHERE статус = 'pending'
AND үүсгэсэн < NOW() - INTERVAL '7 days';
-- Тодорхой ангилалд байгаа нөөцгүй барааг идэвхгүй болгох
UPDATE products
SET идэвхтэй = FALSE
WHERE нөөц = 0
AND ангилал = 'улирлын';
UPDATE ... FROM — өөр хүснэгттэй хослуулах
Нэг хүснэгтийн утгыг өөр хүснэгтийн мэдээлэл дээр тулгуурлан шинэчлэхэд FROM ашиглана:
-- users хүснэгтийн и-мэйлийг profiles хүснэгтээс шинэчлэх
UPDATE users
SET имэйл = profiles.шинэ_имэйл
FROM profiles
WHERE users.id = profiles.user_id
AND profiles.шинэ_имэйл IS NOT NULL;
Шинэчлэлтийн өмнө шалгах
Бодит ажлын орчинд UPDATE хийхээс өмнө яг хэдэн бичлэг өөрчлөгдөхийг SELECT-ээр урьдчилан шалгах нь зөв дадал:
-- Эхлээд шалгах
SELECT id, нэр, статус
FROM orders
WHERE статус = 'pending'
AND үүсгэсэн < NOW() - INTERVAL '7 days';
-- Зөв бичлэгүүд харагдвал UPDATE хийх
UPDATE orders
SET статус = 'cancelled'
WHERE статус = 'pending'
AND үүсгэсэн < NOW() - INTERVAL '7 days';
Хэдэн бичлэг өөрчлөгдсөн мэдэх
psql-д UPDATE хийсний дараа доор тийм мессеж гарна:
UPDATE 3
Энэ нь 3 бичлэг шинэчлэгдсэн гэсэн утгатай. UPDATE 0 гарвал нөхцөл таарсан бичлэг байгаагүй гэсэн үг — WHERE нөхцөлөө шалга.
Жишээ: хэрэглэгчийн профайл шинэчлэх
CREATE TABLE profiles (
id BIGSERIAL PRIMARY KEY,
user_id INTEGER UNIQUE NOT NULL,
дэлгэрэнгүй TEXT,
avatar_url TEXT,
шинэчлэгдсэн TIMESTAMPTZ DEFAULT NOW()
);
-- Профайл шинэчлэх
UPDATE profiles
SET
дэлгэрэнгүй = 'PostgreSQL-г сурч байна. Монголын хөгжүүлэгч.',
avatar_url = 'https://example.com/avatars/bold.jpg',
шинэчлэгдсэн = NOW()
WHERE user_id = 1
RETURNING *;
Дараагийн хичээлд:
DELETE командаар бичлэгүүдийг хэрхэн зохистой устгахыг — аюулгүй аргаас эхлээд каскад устгалт хүртэл сурна.