Мэдээлэл оруулах (INSERT)
Хүснэгт үүсгэж, өгөгдлийн төрлүүдийг сурсан — одоо бодит мэдээлэл оруулах цаг боллоо! INSERT INTO команд нь хүснэгтэд шинэ бичлэг нэмдэг SQL-ийн үндсэн командуудын нэг юм.
Үндсэн INSERT хэлбэр
INSERT INTO хүснэгт_нэр (багана1, багана2, ...)
VALUES (утга1, утга2, ...);
Жишээ болгон users хүснэгт үүсгэж, мэдээлэл оруулъя:
-- Эхлээд хүснэгт үүсгэнэ
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
нэр TEXT NOT NULL,
имэйл TEXT UNIQUE NOT NULL,
нас INTEGER,
үүсгэсэн TIMESTAMPTZ DEFAULT NOW()
);
-- Нэг бичлэг оруулах
INSERT INTO users (нэр, имэйл, нас)
VALUES ('Болд Баатар', 'bold@example.com', 25);
id ба үүсгэсэн баганыг заагаагүй — тэдгээр нь DEFAULT утгаараа автоматаар тавигдана.
Олон бичлэг нэгэн зэрэг оруулах
Нэг INSERT-д олон VALUES мөр бичиж болно — энэ нь олон удаа тусдаа INSERT хийхээс хурдан:
INSERT INTO users (нэр, имэйл, нас)
VALUES
('Сарнай Дорж', 'sarnai@example.com', 22),
('Ганбаяр Лхам', 'ganbayar@example.com', 30),
('Оюунаа Энх', 'oyunaa@example.com', 27),
('Батболд Нар', 'batbold@example.com', 19);
RETURNING — оруулсны дараа утга авах
INSERT-ийн дараа автоматаар үүссэн id эсвэл үүсгэсэн цагийг шуурхай авах хэрэгтэй байдаг. RETURNING үүнийг шийдэнэ:
INSERT INTO users (нэр, имэйл)
VALUES ('Энхтүвшин', 'enkhtuvsh@example.com')
RETURNING id, үүсгэсэн;
Хариу:
id | үүсгэсэн
----+----------------------------
6 | 2024-03-15 10:23:45.123456
(1 row)
Node.js болон бусад backend хэлнүүдэд RETURNING * ашиглаж оруулсан бичлэгийн бүх утгыг авч болно.
INSERT ... ON CONFLICT — давхардал зохицуулах
UNIQUE хязгаарлалттай баганад давтагдах утга оруулахыг оролдвол алдаа гарна. ON CONFLICT үүнийг зохистойгоор шийдэнэ.
Зөрчил гарвал алгасах:
INSERT INTO users (нэр, имэйл)
VALUES ('Болд', 'bold@example.com')
ON CONFLICT (имэйл) DO NOTHING;
Зөрчил гарвал шинэчлэх (upsert):
INSERT INTO users (нэр, имэйл, нас)
VALUES ('Болд Баатар', 'bold@example.com', 26)
ON CONFLICT (имэйл)
DO UPDATE SET
нэр = EXCLUDED.нэр,
нас = EXCLUDED.нас;
EXCLUDED гэдэг нь оруулахыг оролдсон боловч зөрчилдсөн утгыг заадаг. Энэ загвар — upsert гэж нэрлэгддэг бөгөөд бодит системд маш их ашиглагддаг.
Текст болон тусгай тэмдэгт
SQL-д текст утгыг дан хашилт '...'-аар тэмдэглэнэ. Текст дотор дан хашилт байвал хоёр давтана:
-- Буруу
INSERT INTO posts (гарчиг) VALUES ('Монгол's өдөр');
-- Зөв
INSERT INTO posts (гарчиг) VALUES ('Монгол''s өдөр');
-- Эсвэл dollar quoting ашиглах
INSERT INTO posts (гарчиг) VALUES ($$Монгол's өдөр$$);
NULL утга оруулах
Заавал шаардлагагүй баганад утга өгөхгүй бол NULL хадгалагдана:
-- нас заагаагүй → NULL хадгалагдана
INSERT INTO users (нэр, имэйл)
VALUES ('Дорж', 'dorj@example.com');
-- Эсвэл шууд NULL оруулах
INSERT INTO users (нэр, имэйл, нас)
VALUES ('Дорж', 'dorj@example.com', NULL);
NOT NULL хязгаарлалттай баганад NULL оруулахыг оролдвол алдаа гарна:
ERROR: null value in column "нэр" of relation "users" violates not-null constraint
Оруулсан мэдээллийг шалгах
INSERT хийсний дараа SELECT ашиглан оруулсан зүйлээ харна:
SELECT * FROM users;
id | нэр | имэйл | нас | үүсгэсэн
----+----------------+------------------------+-----+----------------------------
1 | Болд Баатар | bold@example.com | 25 | 2024-03-15 10:00:00
2 | Сарнай Дорж | sarnai@example.com | 22 | 2024-03-15 10:00:01
3 | Ганбаяр Лхам | ganbayar@example.com | 30 | 2024-03-15 10:00:01
Дараагийн хичээлд:
SELECT командыг гүнзгий судлан — баганын сонголт, нөхцөл тавих, хайх зэрэг мэдээлэл уншихын бүх арга замыг сурна.