PostgreSQL / Мэдээлэл оруулах (INSERT)

Мэдээлэл оруулах (INSERT)

Хүснэгт үүсгэж, өгөгдлийн төрлүүдийг сурсан — одоо бодит мэдээлэл оруулах цаг боллоо! INSERT INTO команд нь хүснэгтэд шинэ бичлэг нэмдэг SQL-ийн үндсэн командуудын нэг юм.

Үндсэн INSERT хэлбэр

sql
INSERT INTO хүснэгт_нэр (багана1, багана2, ...)
VALUES (утга1, утга2, ...);

Жишээ болгон users хүснэгт үүсгэж, мэдээлэл оруулъя:

sql
-- Эхлээд хүснэгт үүсгэнэ
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 хийхээс хурдан:

sql
INSERT INTO users (нэр, имэйл, нас)
VALUES
    ('Сарнай Дорж', 'sarnai@example.com', 22),
    ('Ганбаяр Лхам', 'ganbayar@example.com', 30),
    ('Оюунаа Энх', 'oyunaa@example.com', 27),
    ('Батболд Нар', 'batbold@example.com', 19);

RETURNING — оруулсны дараа утга авах

INSERT-ийн дараа автоматаар үүссэн id эсвэл үүсгэсэн цагийг шуурхай авах хэрэгтэй байдаг. RETURNING үүнийг шийдэнэ:

sql
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 үүнийг зохистойгоор шийдэнэ.

Зөрчил гарвал алгасах:

sql
INSERT INTO users (нэр, имэйл)
VALUES ('Болд', 'bold@example.com')
ON CONFLICT (имэйл) DO NOTHING;

Зөрчил гарвал шинэчлэх (upsert):

sql
INSERT INTO users (нэр, имэйл, нас)
VALUES ('Болд Баатар', 'bold@example.com', 26)
ON CONFLICT (имэйл)
DO UPDATE SET
    нэр = EXCLUDED.нэр,
    нас = EXCLUDED.нас;

EXCLUDED гэдэг нь оруулахыг оролдсон боловч зөрчилдсөн утгыг заадаг. Энэ загвар — upsert гэж нэрлэгддэг бөгөөд бодит системд маш их ашиглагддаг.

Текст болон тусгай тэмдэгт

SQL-д текст утгыг дан хашилт '...'-аар тэмдэглэнэ. Текст дотор дан хашилт байвал хоёр давтана:

sql
-- Буруу
INSERT INTO posts (гарчиг) VALUES ('Монгол's өдөр');

-- Зөв
INSERT INTO posts (гарчиг) VALUES ('Монгол''s өдөр');

-- Эсвэл dollar quoting ашиглах
INSERT INTO posts (гарчиг) VALUES ($$Монгол's өдөр$$);

NULL утга оруулах

Заавал шаардлагагүй баганад утга өгөхгүй бол NULL хадгалагдана:

sql
-- нас заагаагүй → 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 ашиглан оруулсан зүйлээ харна:

sql
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 командыг гүнзгий судлан — баганын сонголт, нөхцөл тавих, хайх зэрэг мэдээлэл уншихын бүх арга замыг сурна.