Đôi khi tụi mình không muốn điền hết tất cả các trường bằng tay đâu — lười hoặc đơn giản là chưa có đủ dữ liệu. Trong mấy trường hợp như vậy, có thể set sẵn giá trị mặc định để database tự động điền vào khi cần thiết.
Chèn dòng vào bảng
Giá trị mặc định liên quan chặt chẽ đến việc chèn dòng vào bảng. Nên giờ mình sẽ nói sơ qua về nó, vài bài nữa tụi mình sẽ quay lại chủ đề này và đào sâu hơn.
Chèn dòng vào bảng siêu dễ - có lệnh riêng INSERT INTO. INSERT INTO là một câu lệnh SQL để thêm dòng mới vào bảng. Đây là một trong những lệnh được dùng nhiều nhất, đặc biệt khi làm với web form, log, đăng ký user và cập nhật dữ liệu.
Cú pháp lệnh
INSERT INTO bảng (cột1, cột2, ...)
VALUES (giá_trị1, giá_trị2, ...);
Giải thích:
bảng— tên bảng mà bạn muốn thêm dữ liệu vào.cột1,cột2, ... — liệt kê các cột (có thể bỏ qua nếu truyền giá trị cho tất cả các cột đúng thứ tự).giá_trị1,giá_trị2, ... — giá trị tương ứng với các cột đã liệt kê.
Ví dụ đơn giản
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
Thêm vào bảng users một dòng: tên — "Alice", email — "alice@example.com".
Kết quả:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
Chèn nhiều dòng cùng lúc
Cũng có thể chèn nhiều bản ghi chỉ với một câu lệnh — nhanh và tiết kiệm hơn.
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
Kết quả sẽ như này:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
Giá trị mặc định
Còn nhớ cú pháp lệnh chèn dòng không?
INSERT INTO bảng (cột1, cột2, ...)
VALUES (giá_trị1, giá_trị2, ...);
Bạn nghĩ tại sao lại phải liệt kê cột: cột1, cột2 ? Đáng lẽ chỉ cần truyền giá trị đúng thứ tự cột trong bảng là được mà.
Vấn đề là rất nhiều giá trị có thể không cần truyền khi thêm dữ liệu. Ví dụ ID của dòng mới PostgreSQL sẽ tự tính khi thêm. Nó cũng có thể tự lấy ngày/giờ hiện tại khi thêm dòng và điền vào cột tương ứng. Nếu thiếu dữ liệu nào, PostgreSQL sẽ thay bằng NULL.
PostgreSQL có thể làm giúp bạn nhiều thứ hay ho. Và bạn có thể kiểm soát quá trình này — đó là lý do giá trị mặc định tồn tại, được set bằng từ khóa DEFAULT.
Giá trị mặc định sẽ được dùng nếu khi thêm bản ghi mà không truyền giá trị cho cột đó. Cách này vừa tiết kiệm thời gian, vừa tránh lỗi kiểu quên điền giá trị quan trọng.
DEFAULT hoạt động thế nào?
Cùng xem cú pháp nhé. Giá trị mặc định được set khi tạo bảng. Đây là format tổng quát:
CREATE TABLE bảng (
cột kiểu_dữ_liệu DEFAULT giá_trị_mặc_định
);
Hoặc nếu muốn thêm giá trị mặc định cho bảng đã có sẵn:
ALTER TABLE bảng
ALTER COLUMN cột
SET DEFAULT giá_trị_mặc_định;
Mình sẽ nói kỹ hơn về thay đổi bảng ở mấy bài sau :P
Ví dụ 1: Bảng với trường DEFAULT
Tạo bảng students, mỗi sinh viên sẽ tự động nhận ngày đăng ký:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
Bây giờ, khi bạn thêm sinh viên mới mà không truyền registration_date, PostgreSQL sẽ tự động điền ngày hiện tại vào trường này.
INSERT INTO students (name) VALUES ('Alex Lin');
Khi truy vấn:
SELECT * FROM students;
Bạn sẽ nhận được kết quả như sau:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
Ví dụ thực tế
Giá trị mặc định cho cột số
Giả sử có bảng grades, trong đó cột grade nên có giá trị mặc định 0 nếu chưa có điểm.
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
Thêm bản ghi mà không truyền grade:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
Bảng sẽ như này:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
Dùng TEXT với giá trị mặc định
Hãy tưởng tượng bảng teachers, mỗi giáo viên sẽ tự động có trạng thái "chưa xác minh" khi thêm mới.
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'unverified'
);
Thêm giáo viên mà không truyền trạng thái:
INSERT INTO teachers (name) VALUES ('Peter Pall');
Kết quả sẽ là:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | unverified |
Giá trị mặc định cho thời gian
Với bảng meetings lưu thông tin cuộc họp, có thể set trường meeting_time mặc định là 10:00 sáng.
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
Thêm bản ghi:
INSERT INTO meetings (topic) VALUES ('Thảo luận dự án');
Kết quả:
| id | topic | meeting_time |
|---|---|---|
| 1 | Thảo luận dự án | 10:00 |
Lỗi thường gặp khi dùng DEFAULT
Kiểu dữ liệu của giá trị mặc định không khớp. Nếu bạn thử set giá trị text cho cột số, PostgreSQL sẽ báo lỗi:
CREATE TABLE example (
number INTEGER DEFAULT 'text'
);
Lỗi:
invalid input syntax for type integer.
Thay đổi DEFAULT mà không để ý bản ghi cũ. Khi bạn đổi giá trị mặc định, nó không ảnh hưởng tới bản ghi đã có — chúng vẫn giữ giá trị cũ. Nếu muốn cập nhật dòng cũ, dùng UPDATE.
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
Nhầm lẫn giữa DEFAULT và NOT NULL. Giá trị mặc định không có nghĩa là trường đó bắt buộc phải có (NOT NULL). Nếu không chỉ định NOT NULL thì cột vẫn có thể nhận giá trị NULL.
GO TO FULL VERSION