Mẫu cụ thể này thực sự khá nguy hiểm vì nó cho phép ai đó nhập thủ công một ID mới có thể xung đột với khóa thay thế đã tồn tại hoặc khóa mà chuỗi của bạn có thể tạo ra trong tương lai.
Trình kích hoạt của bạn thực sự phải trông như thế này để đảm bảo rằng đối với mỗi bản ghi mới sẽ nhận được một khóa duy nhất. Nếu bạn đang sử dụng phiên bản 11.2 trở lên thì không cần select ... into ...
CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
:new.column1 := my_table_seq.NEXTVAL;
END;
Lợi ích của phương pháp này là nó luôn luôn xong. Bất kỳ giá trị nào mà bất kỳ ai đặt vào cột này đều bị ghi đè lên một thứ sẽ hoạt động và sử dụng đúng trình tự; nếu ai đó quên thêm nó vào câu lệnh sẽ vẫn hoạt động.
Nó giúp bạn không thể bẻ khóa thay thế của mình.
Với những gì bạn đề xuất, hãy tưởng tượng rằng ai đó đặt số 1 thay thế; bạn nhận được một vi phạm khóa chính. Nếu ai đó quên thì còn nhiều lỗi hơn. Bạn sẽ không bao giờ đảm bảo rằng mọi cập nhật cho bảng của bạn sẽ thông qua một điểm nhập duy nhất để trình kích hoạt đảm bảo rằng PK được điền chính xác.
Cần lưu ý rằng từ 12c, bạn có thể sử dụng danh tính cột , làm rõ ràng mối liên kết giữa bảng và tự động tăng; không cần kích hoạt hoặc trình tự. Cú pháp cho việc tạo bảng DDL sẽ là:
create table <table_name> ( <column_name> generated as identity );