MySQL / INSERT

INSERT

INSERT командаар хүснэгтэд шинэ мөр нэмнэ. Энэ бол MySQL-ийн хамгийн түгээмэл ашиглагддаг командуудын нэг юм.

Үндсэн синтакс

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

Жишээ:

sql
INSERT INTO users (name, email)
VALUES ('Болд', 'bold@example.com');
код
Query OK, 1 row affected (0.01 sec)

Зөв оруулсан эсэхийг шалгах:

sql
SELECT * FROM users;
код
+----+------+------------------+---------------------+
| id | name | email            | created_at          |
+----+------+------------------+---------------------+
|  1 | Болд | bold@example.com | 2024-06-01 10:00:00 |
+----+------+------------------+---------------------+

Баганын дарааллын тухай

INSERT дахь баганын дараалал хүснэгтийн тодорхойлолттой таарах шаардлагагүй — гэхдээ утгуудын дараалал баганын дараалалтай яг таарах ёстой.

sql
-- email эхэлж, name хойно — зөв
INSERT INTO users (email, name)
VALUES ('dорж@example.com', 'Дорж');

-- Баганын нэр огт орхивол БҮГДИЙГ дарааллаар оруулна
INSERT INTO users
VALUES (NULL, 'Мөнх', 'munkh@example.com', NOW());
--      ↑ id нь AUTO_INCREMENT тул NULL дамжуулна

Баганын нэрийг орхих нь эмзэг хэрэглэлт — хүснэгтийн бүтэц өөрчлөгдвөл алдаа гарна. Баганын нэрийг үргэлж тодорхой бичих нь аюулгүй.


Анхдагч утга ба AUTO_INCREMENT

DEFAULT утгатай эсвэл AUTO_INCREMENT баганыг орхиж болно — MySQL өөрөө утгыг оруулна.

sql
CREATE TABLE products (
  id         INT            AUTO_INCREMENT PRIMARY KEY,
  name       VARCHAR(200)   NOT NULL,
  price      DECIMAL(10, 2) NOT NULL,
  stock      INT            DEFAULT 0,
  is_active  BOOLEAN        DEFAULT TRUE,
  created_at TIMESTAMP      DEFAULT CURRENT_TIMESTAMP
);
sql
-- stock, is_active, created_at орхисон — анхдагч утгаар орно
INSERT INTO products (name, price)
VALUES ('Утасны дэр', 4990.00);
код
id=1, name='Утасны дэр', price=4990.00, stock=0, is_active=1, created_at=одоогийн цаг

Сүүлд оруулсан AUTO_INCREMENT утгыг авах:

sql
SELECT LAST_INSERT_ID();
код
+-----------------+
| LAST_INSERT_ID()|
+-----------------+
|               1 |
+-----------------+

Энэ утгыг холбоотой хүснэгтэд (жишээ нь захиалгад) ашиглах боломжтой.


Олон мөр нэг дор оруулах

sql
INSERT INTO users (name, email)
VALUES
  ('Болд',  'bold@example.com'),
  ('Дорж',  'dorj@example.com'),
  ('Мөнх',  'munkh@example.com'),
  ('Энх',   'enkh@example.com');
код
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

Мөр тус бүрт тусдаа INSERT бичихээс олон мөрийг нэг командаар оруулах нь хамаагүй хурдан — сүлжээний харилцаа, transaction нэг удаа л явагдана.


INSERT INTO ... SELECT

Нэг хүснэгтийн өгөгдлийг нөгөө хүснэгтэд хуулах:

sql
INSERT INTO archive_users (name, email, created_at)
SELECT name, email, created_at
FROM users
WHERE created_at < '2023-01-01';

SELECT хэсэгт WHERE, JOIN, хүссэн нарийн нөхцөл ашиглаж болно — нарийн шүүлтүүртэй өгөгдлийг шилжүүлэхэд хэрэгтэй.


ON DUPLICATE KEY UPDATE

UNIQUE баганад давтагдсан утга оруулахыг оролдвол алдаа гарна. Энэ тохиолдолд шинэ мөр нэмэхийн оронд байгаа мөрийг шинэчлэх боломжтой:

sql
INSERT INTO products (sku, name, price)
VALUES ('ABC-001', 'Утасны дэр', 4990.00)
ON DUPLICATE KEY UPDATE
  price = VALUES(price),
  name  = VALUES(name);

sku давтагдвал INSERT биш UPDATE хийгдэнэ — "upsert" гэж нэрлэдэг.


INSERT IGNORE

Алдааг үл тоож, амжилтгүй мөрийг алгасна:

sql
INSERT IGNORE INTO users (name, email)
VALUES ('Болд', 'bold@example.com');
-- email аль хэдийн байгаа бол алдаагүй алгасна

Жишээ: myshop database-д өгөгдөл оруулах

sql
USE myshop;

INSERT INTO users (name, email) VALUES
  ('Болд Батбаяр',  'bold@example.com'),
  ('Дорж Гантулга', 'dorj@example.com'),
  ('Мөнх Эрдэнэ',  'munkh@example.com');

INSERT INTO products (name, price, stock) VALUES
  ('Утасны дэр',        4990.00,  50),
  ('Bluetooth чихэвч', 29900.00,  20),
  ('Цэнэглэгч кабель',  1990.00, 100),
  ('Ухаалаг цаг',      89900.00,  10);

INSERT INTO orders (user_id, product_id, quantity) VALUES
  (1, 2, 1),
  (1, 3, 2),
  (2, 1, 1),
  (3, 4, 1);

Дараагийн хичээлд:

SELECT командаар хүснэгтийн өгөгдлийг унших — *, тодорхой багана, DISTINCT, alias ашиглах аргуудыг үзнэ.