Apache Derby Bài 08: Tạo bảng (CREATE TABLE), kiểu dữ liệu số, chuỗi và ngày tháng trong Derby
1. Cú pháp CREATE TABLE trong Apache Derby
Apache Derby tuân thủ chặt chẽ tiêu chuẩn ANSI SQL-92 và SQL:1999. Lệnh tạo bảng có cấu trúc cơ bản như sau:
SQL
CREATE TABLE schema_name.table_name (
column_name_1 data_type [column_constraints],
column_name_2 data_type [column_constraints],
...,
[table_constraints]
);
-
Quy tắc đặt tên: Tên bảng và cột mặc định không phân biệt hoa/thường khi viết hoa toàn bộ trong catalog hệ thống. Nếu không đặt trong dấu ngoặc kép (
"table_name"), Derby sẽ tự động chuyển toàn bộ định danh thành chữ in hoa (TABLE_NAME). -
Schema mặc định: Nếu bạn không chỉ định
schema_name, Derby sẽ tự động gán schema mặc định trùng với tên tài khoản đang đăng nhập (hoặcAPPnếu kết nối ẩn danh).
2. Hệ thống kiểu dữ liệu số (Numeric Data Types)
Derby cung cấp hai nhóm kiểu số: số nguyên chính xác và số thực/thập phân.
| Kiểu dữ liệu | Kích thước | Miền giá trị | Ghi chú & Trường hợp sử dụng |
|---|---|---|---|
| SMALLINT | 2 bytes | đến | Trạng thái (status), mã enum, cờ kích hoạt |
| INT / INTEGER | 4 bytes | đến | Định danh khóa chính (ID), số lượng tồn kho |
| BIGINT | 8 bytes | đến | Giao dịch tài chính lớn, ID hệ thống phân tán |
| DECIMAL(p, s) hoặc NUMERIC(p, s) | Động (tùy theo ) | Tối đa 31 chữ số (), chữ số phần thập phân | Tiền tệ, số đo chính xác tuyệt đối (không bị lỗi làm tròn) |
| REAL | 4 bytes | Độ chính xác dấu phẩy động đơn (~7 chữ số) | Tọa độ, chỉ số khoa học gần đúng |
| DOUBLE / FLOAT | 8 bytes | Độ chính xác dấu phẩy động kép (~15 chữ số) | Tính toán kỹ thuật cần dải giá trị rất rộng |
SQL
-- Ví dụ khai báo cột số:
id BIGINT,
so_luong INT,
gia_ban DECIMAL(12, 2) -- Tối đa 12 chữ số, trong đó có 2 chữ số sau dấu phẩy
3. Hệ thống kiểu chuỗi ký tự (String Data Types)
Derby hỗ trợ các kiểu chuỗi chuẩn ANSI với độ dài cố định hoặc thay đổi:
| Kiểu dữ liệu | Giới hạn ký tự | Cơ chế lưu trữ | Lưu ý quan trọng |
|---|---|---|---|
| CHAR(length) | đến | Cố định độ dài | Luôn tự động chèn khoảng trắng (space-padded) cho đủ length |
| VARCHAR(length) | đến | Độ dài thay đổi | Không thêm khoảng trắng; tiết kiệm bộ nhớ cho tên, email, mô tả |
| LONG VARCHAR | Tối đa | Chuỗi dài | Tương thích ngược; khuyến nghị dùng CLOB cho văn bản lớn |
| CLOB(length) | Tối đa GB | Đối tượng văn bản lớn | Dùng cho nội dung bài viết, dữ liệu JSON hoặc XML lưu trữ |
Cảnh báo về
CHARvsVARCHAR:CHAR(10)khi lưu chuỗi'ABC'sẽ thực sự lưu'ABC '(7 khoảng trắng phía sau). Khi so sánh bằng toán tử=hoặc duyệt chuỗi trong Java, khoảng trắng thừa này có thể gây sai lệch logic nếu không dùng hàmTRIM(). Hãy ưu tiênVARCHARcho hầu hết các trường hợp chuỗi thông thường.
4. Hệ thống kiểu ngày tháng & thời gian (Temporal Data Types)
Derby hỗ trợ đầy đủ 3 loại dữ liệu thời gian cơ bản:
| Kiểu dữ liệu | Định dạng chuẩn (Literal Format) | Kích thước | Ví dụ hợp lệ |
|---|---|---|---|
| DATE | YYYY-MM-DD |
4 bytes | '2026-10-09' |
| TIME | HH:MM:SS |
3 bytes | '07:26:33' |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS[.ffffff] |
10 bytes | '2026-10-09 07:26:33.123456' |
Các hàm và giá trị hệ thống sẵn có:
-
CURRENT_DATE: Trả về ngày hiện tại của hệ thống. -
CURRENT_TIME: Trả về giờ hiện tại. -
CURRENT_TIMESTAMP: Trả về ngày, giờ và microsecond hiện tại.
SQL
-- Gán giá trị mặc định cho thời gian tạo bản ghi
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
5. Thực hành: Tạo bảng hoàn chỉnh với nhiều kiểu dữ liệu
Mở công cụ ij và chạy khối lệnh tạo bảng quản lý sản phẩm hoàn chỉnh:
SQL
CONNECT 'jdbc:derby:firstdb';
CREATE TABLE san_pham (
ma_san_pham VARCHAR(20) NOT NULL,
ten_san_pham VARCHAR(150) NOT NULL,
gia_nhap DECIMAL(12, 2) NOT NULL,
gia_niem_yet DECIMAL(12, 2) NOT NULL,
so_luong_kho INT DEFAULT 0,
ty_le_giam_gia DOUBLE DEFAULT 0.0,
trang_thai SMALLINT DEFAULT 1,
mo_ta_chi_tiet CLOB(50 K),
ngay_nhap_hang DATE DEFAULT CURRENT_DATE,
thoi_gian_tao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_san_pham PRIMARY KEY (ma_san_pham)
);
Thử nghiệm chèn một bản ghi mẫu:
SQL
INSERT INTO san_pham (
ma_san_pham,
ten_san_pham,
gia_nhap,
gia_niem_yet,
so_luong_kho,
ngay_nhap_hang
) VALUES (
'SP-2026-001',
'Bo vi dieu khien ESP32-S3',
120000.00,
165000.00,
50,
'2026-10-09'
);
SELECT ma_san_pham, ten_san_pham, gia_niem_yet, ngay_nhap_hang, thoi_gian_tao
FROM san_pham;
6. Tổng kết
-
Derby hỗ trợ hệ thống kiểu tĩnh chặt chẽ theo chuẩn ANSI SQL:
INT,BIGINT,DECIMALcho số học;CHAR,VARCHAR,CLOBcho chuỗi;DATE,TIME,TIMESTAMPcho thời gian. -
Luôn sử dụng
DECIMAL/NUMERICcho tiền tệ và số liệu cần độ chính xác cao thay vìFLOAT/DOUBLE. -
Sử dụng
DEFAULT CURRENT_TIMESTAMPđể tự động gán mốc thời gian lưu trữ.
Bài tiếp theo sẽ tập trung vào việc thiết lập tính toàn vẹn dữ liệu: Apache Derby Bài 09: Ràng buộc toàn vẹn: Primary Key, Foreign Key, Unique và Not Null.
All rights reserved