Thay đổi cấu trúc Database (Database Migration).

Một hình ảnh thực tế:

"Việc xây một ngôi nhà trống (tạo bảng mới) thì rất dễ. Nhưng khi ngôi nhà đã có người ở và chứa đầy đồ đạc bên trong (database đã có hàng ngàn dòng dữ liệu), việc đập tường để xây thêm phòng (thêm cột, thêm bảng) mà không làm mất đồ đạc cũ mới là đỉnh cao của kỹ sư dữ liệu!"

Để thay đổi cấu trúc của một hoặc nhiều bảng đã có sẵn dữ liệu, chúng ta có 3 cách chính từ thủ công bằng lệnh SQL cho đến dùng công cụ chuyên nghiệp.

Cách 1: Sử dụng lệnh phép thuật ALTER TABLE (Cách căn bản nhất)

Ngôn ngữ SQL cung cấp cho chúng ta một lệnh chuyên dụng tên là ALTER TABLE (Sửa đổi bảng). Lệnh này giúp chúng ta thêm cột mới vào một bảng đang chạy mà không làm ảnh hưởng đến dữ liệu cũ.

💻 Tình huống thực tế: Thêm cột han_sudung vào bảng san_pham ở Bài 5

Hãy viết một đoạn code Python ngắn để nâng cấp bảng:

import sqlite3

ket_noi = sqlite3.connect("cua_hang_mini.db")
nguoi_tho = ket_noi.cursor()

# --- PHÉP THUẬT ALTER TABLE: THÊM CỘT MỚI ---
# Ta ra lệnh: Sửa bảng san_pham, THÊM CỘT (ADD COLUMN) tên là han_sudung chứa chữ
nguoi_tho.execute("""
ALTER TABLE san_pham 
ADD COLUMN han_sudung TEXT DEFAULT 'Không có hạn'
""")

ket_noi.commit()
print("🎉 Tuyệt vời! Đã thêm cột 'Hạn sử dụng' vào bảng sản phẩm thành công!")

# Kiểm tra thử xem dữ liệu cũ có bị mất không:
nguoi_tho.execute("SELECT * FROM san_pham")
print(nguoi_tho.fetchall())

ket_noi.close()

🔍 Kết quả: Khi in ra, ta sẽ thấy các sản phẩm cũ như "Sữa tươi", "Bánh mì" vẫn còn nguyên vẹn, và chúng tự động có thêm một ô dữ liệu mới mang giá trị mặc định là 'Không có hạn'.

Cách 2: Tạo bảng mới và "Di cư" dữ liệu (Khi muốn thêm Khóa ngoại/Quan hệ)

SQLite có một nhược điểm nhỏ: Nó là một cơ sở dữ liệu siêu nhẹ, nên nó không cho phép chúng ta dùng lệnh ALTER TABLE để thêm Khóa ngoại (Foreign Key) vào một bảng đã có sẵn.

Nếu muốn thêm một mối quan hệ mới (ví dụ: biến một cột bình thường thành Khóa ngoại nối sang bảng khác), các kỹ sư sẽ dùng chiến thuật "Di cư dữ liệu" (Data Migration) qua 4 bước:

  1. Bước 1: Đổi tên bảng cũ thành một cái tên tạm thời (Ví dụ: đổi kho_bau thành kho_bau_cu).

  2. Bước 2: Viết lệnh CREATE TABLE kho_bau mới tinh với đầy đủ cấu trúc mới và Khóa ngoại mới như con muốn.

  3. Bước 3: Dùng lệnh INSERT INTO ... SELECT để copy toàn bộ dữ liệu từ bảng kho_bau_cu sang bảng kho_bau mới.

  4. Bước 4: Xóa bảng kho_bau_cu đi (DROP TABLE).

Cách này hơi tốn công gõ code một chút nhưng cực kỳ an toàn và giải quyết được mọi bài toán thay đổi cấu trúc phức tạp trên SQLite.

Cách 3: Sử dụng phần mềm trực quan DB Browser (Cách nhanh nhất khi làm sản phẩm)

Trong lúc chúng ta đang tự tay phát triển dự án (chưa bàn giao cho khách hàng), cách nhanh nhất để sửa cấu trúc bảng là dùng ngay chiếc "kính lúp" DB Browser for SQLite mà ta cài ở Bài 1.

Hướng dẫn các con làm như sau bằng chuột cực kỳ trực quan:

  1. Mở phần mềm DB Browser, mở file database của con ra.

  2. Ở tab Database Structure, nhấp chuột phải vào cái bảng con muốn sửa $\rightarrow$ Chọn Modify Table (Sửa đổi bảng).

  3. Một cửa sổ hiện ra:

    • Con muốn thêm trường dữ liệu? Bấm nút Add rồi gõ tên cột, chọn kiểu dữ liệu (TEXT, INTEGER...).

    • Con muốn thêm quan hệ (Khóa ngoại)? Nhìn sang cột Foreign Key, nhấp đúp vào và chọn bảng con muốn kết nối tới.

  4. Bấm OK, sau đó nhớ bấm nút Write Changes trên thanh công cụ để lưu lại.

💡 Bài học về tư duy Hệ thống :

Chúng ta thấy:

*"Khi phần mềm của chúng ta lớn lên, nhu cầu của người dùng thay đổi thì database cũng phải thay đổi theo. Quá trình này trong môi trường chuyên nghiệp gọi là Database Migration.

Sau này khi học lên cao, dùng các framework lớn như Django (Python) hay Flutter, máy tính sẽ có những công cụ tự động làm việc này bằng lệnh makemigrations và migrate. Máy tính sẽ tự động so sánh code của con với database để tự sửa bảng mà con không cần gõ từng lệnh SQL thủ công nữa!"*