Làm cách nào để kiểm tra trình kích hoạt nếu toàn bộ hàng vẫn giữ nguyên sau khi cập nhật?


10

Tất nhiên tôi có thể làm điều đó cho mọi cột so sánh như thế này:

if (old.column1 = new.column1 and old.column2 = new.column2...)

Nhưng nó sẽ khó mã hóa và khó duy trì nếu tôi thêm một cột khác trong tương lai.

Có cách nào để kiểm tra xem tất cả các cột có giống nhau không mà không kiểm tra từng cột riêng lẻ?


Bạn có thể sử dụng EXCEPT - techonthenet.com/postgresql/except.php
Scott Hodgin

Xin lỗi, nhưng EXCEPT sẽ được sử dụng như thế nào trong trường hợp của tôi? Tôi đang cố gắng so sánh hàng cũ với các giá trị hàng mới, từ những gì tôi biết về EXCEPT, nó được sử dụng để so sánh các hàng hiện có từ hai truy vấn, không phải trong bối cảnh cũ / mới của trình kích hoạt ...
Mateus Viccari

Tôi không quen với dbms của bạn - có cách nào để chọn mới. * Ngoại trừ chọn cũ. *? Nếu hàng đếm = 0, không có hàng nào thay đổi
Scott Hodgin

Câu trả lời:


15

Bạn chỉ có thể so sánh oldvà các newhồ sơ sử dụng is not distinct frommà xử lý các giá trị NULL một cách chính xác (nếu tất cả các cột được định nghĩa là NOT NULL bạn chỉ có thể sử dụng =hoặc <>)

if old is not distinct from new then 
   .... do something
end if;

Điều tương tự có thể được thực hiện để kiểm tra nếu ít nhất một cột thay đổi:

if old is distinct from new then 
   .... do something
end if;

NULL được xử lý như thế nào bởi những điều kiện này?
ypercubeᵀᴹ

@ ypercubeᵀᴹ: điểm tốt. Tôi cập nhật câu trả lời của tôi.
a_horse_with_no_name

Thnx. Tôi đã kiểm tra nhanh và dường như old=newxử lý trường hợp chính xác như thế old is not distinct from old. Nói cách khác, tôi không thể tìm thấy trường hợp nào old=newcho kết quả NULL. Tôi không mong đợi điều đó!
ypercubeᵀᴹ

Tôi nghĩ rằng sự khác biệt sẽ là với old <> newnhưng tôi không hoàn toàn chắc chắn.
a_horse_with_no_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.