Como diz Orbman, a maneira padrão de fazer isso é com uma sequência. O que a maioria das pessoas também faz é acoplar isso com um gatilho de inserção. Assim, quando uma linha é inserida sem um ID, o gatilho é acionado para preencher o ID para você a partir da sequência.
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 é um dos poucos casos em que faz sentido usar um gatilho no Oracle.