Следующая статья: PHP и MySQL. С чего начать?
Если неохота разбираться в тонкостях:
CREATE TABLE foo ( id SERIAL, … );
и всё заработает.
Если есть желание разобраться:
Для генерации «суррогатных» первичных ключей в PostgreSQL используются «последовательности» (SEQUENCE). Вышеприведённый пример на самом деле раскрывается в такую конструкцию:
CREATE SEQUENCE foo_id_seq;
CREATE TABLE foo (
id integer DEFAULT nextval('foo_id_seq'),
…
);
CREATE UNIQUE INDEX foo_id_key ON foo (id);
Если делать ту же работу «вручную», то нагляднее всего (IMHO!) получается так:
CREATE SEQUENCE foo_seq;
CREATE TABLE foo (
id integer NOT NULL DEFAULT nextval('foo_seq'),
…
PRIMARY KEY (id)
);
Если нужно (как чаще всего и бывает), чтобы поле заполнялось автоматически, не надо указывать его в команде INSERT вообще. При попытке вставить туда значение NULL или 0 возникнет ошибка.
Следует отметить: последовательность совершенно не зависит от таблицы, при большом желании можно использовать одну и ту же последовательность для генерации ключей в разных таблицах. Вообще, возможности последовательностей в PostgreSQL значительно шире, чем auto_increment полей в MySQL. Как обычно, читайте документацию.