Como dice Orbman, la forma estándar de hacerlo es con una secuencia. Lo que la mayoría de la gente también hace es combinar esto con un disparador de inserción. Por lo tanto, cuando se inserta una fila sin ID, el disparador se activa para completar la ID de la secuencia.
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;
Este es uno de los pocos casos en los que tiene sentido utilizar un disparador en Oracle.