Как использовать значение столбца по умолчанию для переменной rowtype в PostgreSQL? - PullRequest
0 голосов
/ 25 января 2012

У меня есть таблица и процедура, подобная этой:

CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
info TEXT);

create or replace function test() returns void as
$$
declare
  v_row test_table%ROWTYPE;
begin
  v_row.info := 'test';
  insert into test_table values (v_row.*);
end;
$$ language plpgsql;

select test();

ERROR:  null value in column "id" violates not-null constraint

Как использовать значение по умолчанию для поля v_row.id?Я знаю, что могу написать

insert into test_table (info) values (v_row.info);

Но в моем реальном случае у меня много таких таблиц с большим количеством столбцов, и я действительно хочу избежать перечисления всех столбцов в операторе вставки.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Написав insert into test_table values (v_row.*);, вы фактически заставляете postgres вставлять значение NULL в столбец id.

Вам потребуется запустить такой код - либо в приложении

v_row.id := nextval( 'mysequence' );

.или в триггере

IF NEW.id IS NULL THEN
    NEW.id := nextval( 'mysequence' );
END IF;
0 голосов
/ 25 января 2012

Вы можете проверить, есть ли у Postgresql ПОСЛЕДОВАТЕЛЬНОСТЬ для этого столбца, а затем, если для этого столбца установлено значение DEFAULT. В psql попробуйте:

\d+ test_table

Вы должны увидеть что-то вроде этого:

id    | integer                     | default nextval('test_table_id_seq'::regclass) |

Если нет default nextval('somethink'), то вы должны проверить, есть ли последовательность для этого столбца:

\ds+

Вы должны увидеть что-то вроде этого:

 public | test_table_id_seq | sequence

Если у вас не будет последовательности, у вас есть СОЗДАТЬ ее:

CREATE SEQUENCE test_table_id_seq;

И если у вас не будет следующего значения по умолчанию (somethink), вы должны использовать ALTER TABLE:

ALTER TABLE test_table ALTER COLUMN id SET DEFAULT nextval('test_table_id_seq');

Вы можете найти информацию об этом здесь: http://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

Возможно, вы можете это понять, хотя английский не является моим родным языком ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...