Только начал изучать PostgreSQL, возникла непонятная для меня ошибка.
Есть таблица, создавалась командами:
create table ts_test03
(
id timestamp(6) with time zone not null default current_timestamp,
val bigint
);
alter table ts_test03 add primary key (id);
В PostgreSQL Studio скрипт создания выглядит так:
CREATE TABLE public."ts_test03" (
id timestamp(6) with time zone NOT NULL PRIMARY KEY,
val bigint
)
В описании столбцов таблицы в поле Default в строке "id" стоит "now()".
Есть функция:
CREATE FUNCTION public."ts_test03load"(cnt integer) RETURNS void AS $$
DECLARE
ts timestamp(6) with time zone;
BEGIN
FOR i IN 1..cnt LOOP
ts := now();
insert into ts_test03 (id,val) values (ts,i);
END LOOP;
END;
$$ LANGUAGE plpgsql;
При вызове её:
select ts_test03load(100);
получаю ошибку
ERROR: duplicate key value violates unique constraint "ts_test03_pkey"
DETAIL: Key (id)=(2016-11-10 10:02:00.027207+02) already exists.
CONTEXT: SQL statement "insert into ts_test03 (id,val) values (ts,i)"
PL/pgSQL function ts_test03load(integer) line 8 at SQL statement
STATEMENT: select ts_test03load(10) LIMIT 5
Пробовал вариант функции без явного указания поля "id" (чтобы срабатывало значение now() из default) - результат тот же
CREATE OR REPLACE FUNCTION ts_test03load1(cnt integer) RETURNS void AS $$
BEGIN
FOR i IN 1..cnt LOOP
insert into ts_test03 (val) values (i);
END LOOP;
END;
$$ LANGUAGE plpgsql;
ERROR: duplicate key value violates unique constraint "ts_test03_pkey"
DETAIL: Key (id)=(2016-11-10 10:06:32.237613+02) already exists.
CONTEXT: SQL statement "insert into ts_test03 (val) values (i)"
PL/pgSQL function ts_test03load1(integer) line 4 at SQL statement
STATEMENT: select ts_test03load1(10) LIMIT 5
В чём проблема?
Вопрос снимается - здесь нашёл ответ https://www.postgresql.org/docs/current/static/functions-datetime.html#F...
пример явно показывает что
пример явно показывает что primary key по timestamp не самая лучшая идея