2010-04-06 16 views

Trả lời

10

Như Orbman nói, cách tiêu chuẩn để làm điều đó là với một chuỗi. Những gì hầu hết mọi người cũng làm là cặp vợ chồng này với một kích hoạt chèn. Vì vậy, khi một hàng được chèn mà không có ID, trình kích hoạt sẽ kích hoạt ID cho bạn từ chuỗi.

CREATE SEQUENCE SEQ_ROLLINGSTOCK_ID START WITH 1 INCREMENT BY 1 NOCYCLE; 

CREATE OR REPLACE TRIGGER BI_ROLLINGSTOCK 
BEFORE INSERT ON ROLLINGSTOCK 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
WHEN (NEW.ID IS NULL) 
BEGIN 
    select SEQ_ROLLINGSTOCK_ID.NEXTVAL 
    INTO :NEW.ID from dual; 
END; 

Đây là một trong số ít trường hợp sử dụng trình kích hoạt trong Oracle có ý nghĩa.

+0

Lưu ý rằng trình kích hoạt không hoàn toàn cần thiết. Vì vậy, miễn là bất cứ khi nào một chèn được thực hiện giá trị từ trình tự được sử dụng bạn là tốt. Nó không phải là Tự động, nhưng nó cũng không đòi hỏi nhiều kỷ luật. Tôi cố gắng tuyệt vọng để tránh gây ra vấn đề về sở thích cá nhân. –

+0

@Adam, tôi hoàn toàn đồng ý. Đây là một trong số ít những nơi mà tôi sẽ sử dụng kích hoạt, chủ yếu là do thiếu các tiêu chuẩn đặt tên khủng khiếp trong cơ sở dữ liệu mà tôi trông nom, làm cho nó gần như không thể biết được trình tự chính xác để sử dụng. –

4

Nếu bạn thực sự không quan tâm những gì khóa chính được giữ, bạn có thể sử dụng loại RAW cho cột khóa chính chứa guid do hệ thống tạo dưới dạng nhị phân.

CREATE TABLE RollingStock 
( 
    ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY, 
    NAME VARCHAR2(80 CHAR) NOT NULL  
); 
Các vấn đề liên quan