Sửa đúng ô, rồi đọc lại
Trong `bannhac`, nếu một bài thử đang gắn nhầm với Mai An nhưng đúng là của **nhạc sĩ hư cấu Hà Vy**, tìm đúng hàng theo `idBannhac`. Với HeidiSQL 12.21.1.1 bản GTK2, tiếng Anh trên Linux, nháy đúp ô `idNhacsi`. Nếu mới hiện ô mã, bấm mũi tên để mở danh sách; chọn **Hà Vy (2)** bằng chuột. Nhấn Tab để chốt ô, rồi Post; dùng F5 đọc lại dữ liệu. Trên bản sao thử, hàng bài mã 6 đổi mã nhạc sĩ từ 1 sang 2, tên bài và mã bài giữ nguyên.
Chỉ thực hành thay đổi trên dữ liệu thử được phép sửa. Đọc lại cả `tenBannhac` và `idNhacsi` theo mã bài; không chọn hàng chỉ vì đang nằm ở dòng thứ hai hay thứ ba. “Ngày nắng” gắn với Mai An hay Hà Vy trong tình huống này là giả định để luyện sửa dữ liệu, không phải sự thật bên ngoài. Nếu ứng dụng báo lỗi, dừng lần sửa và kiểm dữ liệu đã lưu trước khi tiếp tục.
Mã thay thế phải tồn tại ở `nhacsi`; nếu gõ mã 99 chưa có, MySQL từ chối. Khóa ngoại kiểm **mã có tồn tại**, không biết người được chọn có thật sự sáng tác bài ngoài đời hay không. Vì vậy, kiểm nội dung nhập vẫn là trách nhiệm của người quản lí dữ liệu.
Đi theo đường tham chiếu trước khi xóa
Bảng `bannhac` chứa bài của nhạc sĩ, nên khi bài còn dùng `idNhacsi = 1`, xóa hàng Mai An mã 1 trong `nhacsi` bị MySQL chặn theo ràng buộc đang dùng. Tương tự, khi `banthuam` đang trỏ tới bản nhạc mã 1, xóa **bản nhạc mã 1** cũng bị chặn.
Trong CSDL thử riêng, mở Data của bảng cha, đọc mã rồi chọn **đầu hàng**, nhấn Ctrl+Delete. Hộp xác nhận phải ghi đúng số hàng cần xử lí; nhấn OK trên dữ liệu thử đã được phép xóa. Với hai hàng cha còn được tham chiếu trên, HeidiSQL hiện **SQL Error (1451)**; đóng thông báo và F5 kiểm các hàng vẫn còn. Nếu con trỏ đang sửa trong một ô, nhấn Escape để ra khỏi chế độ nhập trước khi chọn hàng; xóa nội dung ô khác với xóa cả hàng.
Đó không có nghĩa mọi hàng ở bảng cha đều không xóa được: hàng **chưa có bản ghi con tham chiếu** có thể xóa nếu đúng quyền và mục đích. Trước khi xóa, đọc mã hàng, các bảng đang tham chiếu và số hàng trong hộp xác nhận. Khi cần bỏ một bản ghi có liên quan, phải xem xét nghiệp vụ và xử lí các bản ghi phụ thuộc theo quy trình được phép; không tắt khóa ngoại hay chọn xóa dây chuyền chỉ để hết thông báo lỗi. Trong CSDL bài tập này, hành động mặc định là chặn xóa hàng cha đang được tham chiếu.
Bài luyện
Bản nhạc đang lưu idNhacsi = 1. Muốn sửa sang nhạc sĩ mã 2 đã có, thao tác nào đúng?
Mã 2 là mã tham chiếu hợp lệ cần dùng.
idBannhac định danh chính bản nhạc.
Xóa bảng sẽ phá dữ liệu khác.
Cột mã bài không lưu tên người.
Lời giải
Sửa khóa ngoại của đúng hàng sang mã nhạc sĩ có thật, Post và kiểm kết quả đã lưu.
Bài luyện
Nhạc sĩ mã 1 đang có bản nhạc tham chiếu. Với quy tắc xóa mặc định của CSDL bài tập, xóa hàng nhạc sĩ mã 1 sẽ thế nào?
CSDL đang dùng không bật xóa dây chuyền.
Khóa ngoại trên bannhac bảo vệ quan hệ.
Đổi thành 0 không có hàng cha hợp lệ.
Bảng được tham chiếu vẫn chịu ràng buộc khi xóa.
Lời giải
Vì bannhac còn trỏ tới nhacsi mã 1, MySQL chặn xóa hàng cha theo quy tắc đang dùng.
Bài luyện
Bài mã 1 đang được banthuam tham chiếu. Muốn xóa bài mã 1 nhưng hệ quản trị báo lỗi khóa ngoại. Nên làm gì?
Tắt ràng buộc có thể để lại bản thu không có bài.
Cần hiểu dữ liệu phụ thuộc và quyền xử lí.
Đổi tên không giải quyết quan hệ.
Thông báo này là cơ chế giữ toàn vẹn dữ liệu.
Lời giải
Kiểm các hàng banthuam đang tham chiếu bài mã 1. Chỉ xử lí/xóa chúng khi đúng nghiệp vụ và được phép; không ép bỏ ràng buộc.
Đang học