В MySQL есть прямая директива для поля в таблице: auto_increment.
Например:
CREATE TABLE mytable(
id MEDIUMINT NOT NULL AUTO_INCREMENT
);
В PostgreSQL и Oracle этот вопрос решен иначе - с помощью последовательностей. На первый взгляд, более сложно, но, одновременно, и более гибко.
Допустим, такая же таблица нам нужна в оракле.
CREATE TABLE mytable(
id NUMBER
);
Поэтому нужно создать последовательность. В постгресе и оракле это делается почти одинаково. Oracle:
CREATE SEQUENCE mytable_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE;
Теперь нужно привязать эту последовательность к полю.
В постгресе это делалось бы так:
alter table mytable alter column id SET DEFAULT NEXTVAL('mytable_seq')
Синтаксис работы с последовательностями в оракле немного отличается от постгресового хотя бы на примере nextval. В Oracle nextval берется так:
select nextval('mytable_seq') from dual
Но Oracle не позволяет засунуть в default для столбца несистемную функцию - в данном случае nextval. И все примеры вставки в таблицу с использованием последовательности выглядят примерно так:
INSERT INTO mytable (id) VALUES (mytable_seq.nextval);
Еще один вариант - использование костыля в лице триггера, что, в целом, в ворота еще как-то лезет, но не во все:
create or replace trigger mytable_trg
before insert on mytable
for each row
begin
if :new.id is null then
select mytable_seq.nextval into :new.id from dual;
end if;
end;
Возможно, этот неприятный момент будет устранен в будущих версиях оракла.