0

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ặc APP nế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 −32,768-32,768 đến 32,76732,767 Trạng thái (status), mã enum, cờ kích hoạt
INT / INTEGER 4 bytes −2,147,483,648-2,147,483,648 đến 2,147,483,6472,147,483,647 Định danh khóa chính (ID), số lượng tồn kho
BIGINT 8 bytes −9.22×1018-9.22 \times 10^{18} đến 9.22×10189.22 \times 10^{18} 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 pp) Tối đa 31 chữ số (p≤31p \le 31), ss 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) 11 đến 254254 Cố định độ dài Luôn tự động chèn khoảng trắng (space-padded) cho đủ length
VARCHAR(length) 11 đến 32,67232,672 Độ 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 32,70032,700 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 22 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ề CHAR vs VARCHAR: 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àm TRIM(). Hãy ưu tiên VARCHAR cho 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, DECIMAL cho số học; CHAR, VARCHAR, CLOB cho chuỗi; DATE, TIME, TIMESTAMP cho thời gian.

  • Luôn sử dụng DECIMAL/NUMERIC cho 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí