Mặc dù nhiều năm của câu hỏi này đã trôi qua, tôi muốn làm rõ cho những người nói tiếng Tây Ban Nha, các bài kiểm tra đã được thực hiện trong Postgres:
Các ràng buộc sau đây đã được thêm vào một bảng gồm 1337 bản ghi, trong đó bộ này là khóa chính:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Điều này tạo ra một khóa chính mặc định KHÔNG ĐƯỢC ĐÁNH GIÁ cho bảng vì vậy khi thử CẬP NHẬT tiếp theo, chúng tôi gặp lỗi:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
LRI: khóa trùng lặp vi phạm hạn chế duy nhất «unique_div_nkit»
Trong Postgres, việc thực hiện CẬP NHẬT cho mỗi ROW xác minh rằng RESTRICTION hoặc CONSTRAINT được đáp ứng.
CONSTRAINT IMMEDIATE hiện được tạo và mỗi câu lệnh được thực thi riêng:
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
Truy vấn OK, 0 hàng bị ảnh hưởng (thời gian thực hiện: 0 ms; tổng thời gian: 0 ms) Truy vấn OK, 1328 hàng bị ảnh hưởng (thời gian thực hiện: 858 ms; tổng thời gian: 858 ms) ERROR: llave trùngada viola giới hạn : Ya tồn tại la llave (div_nkit) = (1338).
Ở đây SI cho phép thay đổi khóa chính vì nó thực thi toàn bộ câu hoàn chỉnh đầu tiên (1328 hàng); nhưng mặc dù là trong giao dịch (BEGIN), CONSTRAINT được xác thực ngay lập tức sau khi hoàn thành mỗi câu mà không thực hiện CAM KẾT, do đó tạo ra lỗi khi thực hiện INSERT. Cuối cùng, chúng tôi đã tạo ra CONSTRAINT DEAXRED làm như sau:
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
Nếu chúng tôi thực thi từng câu lệnh của ** Khối 2 **, thì mỗi câu riêng biệt, không có lỗi nào được tạo ra cho INSERT vì nó không xác thực nhưng CAM KẾT cuối cùng được thực thi khi tìm thấy sự không nhất quán.
Để biết thông tin đầy đủ bằng tiếng Anh, tôi khuyên bạn nên kiểm tra các liên kết:
Các ràng buộc SQL có thể bảo vệ trong Độ sâu
KHÔNG ĐÁNG TIN CẬY so với NGAY LẬP TỨC NGAY LẬP TỨC