Nếu bạn không thể chèn bản ghi mới vào bảng do ràng buộc duy nhất, đừng bỏ lỡ đọc bài viết này. Nó sẽ giúp bạn giải quyết vấn đề này.
Trong bài viết này, chúng tôi sẽ giới thiệu 4 phương pháp để giải quyết vấn đề khi bạn không chèn được bản ghi mới vì nó vi phạm ràng buộc duy nhất của bảng trong SQL Server.
Một trường hợp thực tế:
Bây giờ chúng ta hãy xem một trường hợp thực tế. Chúng tôi có một cơ sở dữ liệu tên là “Sản phẩm” và có một bảng tên là “DataNumenSản phẩm” trong cơ sở dữ liệu. Có hai trường trong bảng, tức là “ProductId” và “ProductName”, với kiểu dữ liệu lần lượt là “int” và “varchar”. Và “ProductId” là khóa chính có ràng buộc duy nhất.
Hiện tại có một số bản ghi trong bảng như sau:
Hình 1 Bản ghi trong bảng “DataNumenSản phẩm"
Giả sử có hai DBA cho cơ sở dữ liệu, tức là Jim và Tom. Một ngày nọ, Jim xóa bản ghi đầu tiên trong bảng như sau:
DELETE FROM DataNumenProduct WHERE ProductId=1;
Vào ngày thứ hai, Tom chèn một bản ghi mới vào bảng, bản ghi này có cùng khóa chính với bản ghi đã bị xóa, như sau:
INSERT INTO DataNumenProduct VALUES(1,'DataNumen OutLook Repair');
Vì vậy, bảng của chúng tôi có các bản ghi sau, như sau:
Hình 2 Các bản ghi được cập nhật trong Bảng “DataNumenCác sản phẩm"
Bây giờ nếu Jim muốn khôi phục bản ghi đã xóa trở lại bảng, nó sẽ vi phạm ràng buộc duy nhất của khóa chính “ProductId”. Trong trường hợp như vậy, chúng ta có thể sử dụng một trong các cách giải quyết dưới đây để giải quyết vấn đề.
Cách giải quyết 1: Sửa đổi khóa chính của bản ghi mới để ngăn chặn xung đột
Chúng ta có thể sửa đổi khóa chính của bản ghi sẽ được chèn vào một giá trị mới khác với giá trị của tất cả các bản ghi hiện có trong bảng. Lấy trường hợp trên làm ví dụ, để chèn bản ghi, chúng ta có thể sửa đổi giá trị khóa chính từ 1 thành 5. Sau đó, chúng ta có thể khôi phục bản ghi mới được tạo trở lại bảng, như sau:
INSERT INTO DataNumenProduct VALUES(5, 'DataNumen Access Repair');
Dưới đây là các bản ghi cuối cùng trong bảng:
Hình 3 Bản ghi cuối cùng trong bảng “DataNumen Các sản phẩm"
Giải pháp 2: Sửa đổi khóa chính của bản ghi hiện có để ngăn chặn xung đột
- Trước tiên, chúng ta cần cập nhật giá trị khóa chính của bản ghi hiện có, điều này có thể gây ra xung đột, như sau:
UPDATE DataNumenProduct SET ProductId = 6 WHERE ProductId = 1;
Dưới đây là các bản ghi được cập nhật trong bảng:
Hình 4 Các bản ghi được cập nhật trong Bảng “DataNumen Các sản phẩm"
- Sau đó, chúng ta có thể khôi phục bản ghi đã xóa trở lại bảng như sau:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair ');
Bây giờ hãy xem phiên bản cuối cùng như sau:
Hình 5 Bản ghi cuối cùng trong Bảng “DataNumen Các sản phẩm"
Giải pháp thay thế 3: Tạm thời vô hiệu hóa ràng buộc duy nhất thông qua SQL.
- Để giải quyết vấn đề, chúng ta có thể tạm thời xóa ràng buộc khóa chính “pk” trong bảng như sau:
ALTER TABLE DataNumenProduct DROP CONSTRAINT pk;
- Sau đó, chúng ta có thể thêm lại bản ghi đã xóa vào bảng như sau:
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Bây giờ hãy xem các bản ghi trong bảng:
Hình 6 Các bản ghi được cập nhật trong Bảng “DataNumen Các sản phẩm"
- Sau đó, vì hai bản ghi có cùng giá trị khóa chính nên chúng ta cần sửa đổi một trong số chúng để tránh xung đột, như sau:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Cuối cùng, chúng ta thêm lại ràng buộc khóa chính “pk” vào bảng như sau:
ALTER TABLE DataNumenProduct ADD CONSTRAINT pk PRIMARY KEY(ProductId);
Bây giờ có một số bản ghi trong bảng như sau:
Hình 7 Cập nhật nội dung trong bảng “DataNumen Các sản phẩm"
Giải pháp thay thế 4: Tạm thời vô hiệu hóa ràng buộc duy nhất thông qua SQL Server Xưởng quản lý:
- Đầu tiên, chúng ta xóa ràng buộc khóa chính “pk” trong bảng thông qua GUI, như sau:
Hình 8 Xóa ràng buộc khóa chính “pk” qua GUI
- Sau đó, chúng tôi chèn bản ghi đã xóa trong trường hợp thực vào bảng như bên dưới.
INSERT INTO DataNumenProduct VALUES(1, 'DataNumen Access Repair');
Bây giờ có một số bản ghi trong bảng như sau:
Hình 9 Cập nhật nội dung trong bảng “DataNumen Các sản phẩm"
- Sau đó, chúng tôi sửa đổi giá trị khóa chính của bản ghi hiện có trong bảng như sau:
UPDATE DataNumenProduct SET ProductId = 5 WHERE ProductName = 'DataNumen Outlook Repair';
- Cuối cùng, chúng tôi thêm lại ràng buộc khóa chính “pk” vào bảng thông qua GUI, như sau:
Hình 8 Thêm lại ràng buộc khóa chính “pk” qua GUI
Giải quyết SQL Server cơ sở dữ liệu tham nhũng
Khác với các ràng buộc duy nhất, SQL Server tham nhũng cũng là một vấn đề rất phổ biến gây khó chịu cho các DBA. Thông thường chúng ta có thể sử dụng SQL Server các lệnh tích hợp để giải quyết các lỗi. Tuy nhiên, nếu chúng không hoạt động thì chúng ta có thể nhờ đến một số bên thứ ba SQL Server công cụ khôi phục dữ liệu.
Giới thiệu tác giả:
Jim Hu là chuyên gia phục hồi dữ liệu tại DataNumen, Inc., công ty hàng đầu thế giới về công nghệ khôi phục dữ liệu, bao gồm truy cập sửa chữa và dbf sửa chữa các sản phẩm phần mềm. Để biết thêm thông tin, hãy truy cập www.datanumennăm








