Установить значение по умолчанию одного столбца для другого столбца в инструкции INSERT - PullRequest
4 голосов
/ 02 марта 2012

У меня есть таблица, назовите ее t1, с тремя целочисленными столбцами c1, c2, c3.c1 имеет значение по умолчанию:

not null default nextval

Для операторов INSERT, которые я сейчас выполняю, я хочу, чтобы c2 имел то же значение, которое будет присвоено c1.Это не относится к большинству моих вставок, поэтому нет смысла определять для c2 значение по умолчанию или триггер при обновлении.В настоящее время я делаю два заявления:

INSERT INTO t1 (c3) VALUES (val3);
UPDATE t1 SET c2 = c1 WHERE //Get correct row

Ответы [ 3 ]

7 голосов
/ 02 марта 2012

нет гарантии , в которой будут обрабатываться элементы заказа набора. Также не нужно совершать два вызова функций. Используйте дополнительный выбор или CTE :

INSERT INTO t (c1, c2, c3)
SELECT x.s, x.s, val3
FROM  (SELECT nextval('c1_seq') AS s) x;

Или с CTE:

WITH   x(s) AS (SELECT nextval('c1_seq'))
INSERT INTO t (c1, c2, c3)
SELECT x.s, x.s, val3
FROM   x;
2 голосов
/ 02 марта 2012

В вашем случае вам нужно установить значение по умолчанию для c2 на текущее значение последовательности, связанное с c1 , то есть:

ALTER TABLE
  t1
ALTER COLUMN
  c2
SET DEFAULT
  CURRVAL(PG_GET_SERIAL_SEQUENCE('t1', 'c1'));

Конечно, это не сработает, если вы укажете явное значение для c1 .Если есть такие случаи, то вы должны выполнить ПЕРЕД триггером, чтобы быть уверенным, что c2 будет всегда совпадать с c1 при вставке.1016 *

CREATE FUNCTION sync_c2() RETURNS trigger AS $$
BEGIN
  IF NEW.c2 IS NULL THEN
    NEW.c2 := NEW.c1;
  END IF;

  RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER
  sync_c2
BEFORE INSERT ON
  t1
FOR EACH ROW EXECUTE PROCEDURE
  sync_c2();
1 голос
/ 02 марта 2012

Значение по умолчанию для c1 будет использоваться, только если вы не предоставите для него явное значение или, конечно, если вы явно запросите значение по умолчанию с default в ваших ЗНАЧЕНИЯХ.Вы также можете свободно получить доступ к последовательности, используя nextval и currval внутри своих ЗНАЧЕНИЙ;функция nextval делает это:

Последовательность и возврат нового значения.

и currval:

Возвращаемое значение чаще всегонедавно полученный с помощью nextval для указанной последовательности

Таким образом, вы можете сделать это, чтобы получить следующее значение последовательности для c1 и получить то же значение для c2:

insert into t1 (c1, c2, c3) values (nextval('c1_seq'), currval('c1_seq'), val3)

где c1_seq - это имя последовательности, которую вы используете для предоставления значений по умолчанию для c1.

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