Basic syntax
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);
Always list the columns explicitly — it keeps your code working after someone adds a column.
INSERT INTO students (roll_no, name_en, name_bn, email, age, admitted_on)
VALUES ('CSE-101', 'Rahim Uddin', 'রহিম উদ্দিন', 'rahim@example.com', 20, '2024-01-15');
Multiple rows at once
INSERT INTO students (roll_no, name_en, age, admitted_on) VALUES
('CSE-102', 'Karim Ali', 21, '2024-01-15'),
('CSE-103', 'Fatema Begum', 19, '2024-02-01'),
('CSE-104', 'Nusrat Jahan', 22, '2024-02-01');
One multi-row insert is far faster than many single inserts because it is one round trip and one transaction.
Insert from a query
INSERT INTO alumni (name_en, department, graduated_on)
SELECT name_en, department, CURDATE()
FROM students
WHERE cgpa >= 3.5;
Handling duplicates
-- skip rows that violate a unique key
INSERT IGNORE INTO students (roll_no, name_en, admitted_on)
VALUES ('CSE-101', 'Duplicate', '2024-03-01');
-- upsert: insert, or update if the key already exists
INSERT INTO students (roll_no, name_en, admitted_on)
VALUES ('CSE-101', 'Rahim U.', '2024-01-15')
ON DUPLICATE KEY UPDATE name_en = VALUES(name_en);
-- MySQL 8.0.19+ preferred alias form
INSERT INTO students (roll_no, name_en, admitted_on)
VALUES ('CSE-101', 'Rahim U.', '2024-01-15') AS new
ON DUPLICATE KEY UPDATE name_en = new.name_en;
-- REPLACE = delete the old row, then insert (loses other columns!)
REPLACE INTO students (roll_no, name_en, admitted_on)
VALUES ('CSE-101', 'Rahim U.', '2024-01-15');
Getting the generated id
INSERT INTO students (roll_no, name_en, admitted_on)
VALUES ('CSE-105', 'Tanvir', CURDATE());
SELECT LAST_INSERT_ID(); -- per-connection, safe under concurrency
Bulk loading a file
LOAD DATA LOCAL INFILE '/tmp/students.csv'
INTO TABLE students
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(roll_no, name_en, age, admitted_on);
This is the fastest way to import large datasets — often 20× faster than row-by-row inserts.