2016-08-03 3 views
0

Я пытаюсь это выражение, но я не нахожу, где неправильно мой синтаксис:Как добавить конкатенированный столбец в существующую таблицу?

alter table "TableName" 
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC) 

Все три поля являются характер изменения.

+5

Почему бы просто не создать представление? – Nicarus

+0

Потому что я присоединяюсь к другим таблицам и добавляю записи потом –

ответ

1

Что плохое в том, что вы хотите, обновление после добавления столбца:

alter table "TableName" add column "NameColumn" varchar(255); -- or whatever 

update "TableName 
    set "NameColumn" = concat(ColumnA, ColumnB, ColumnC); 

Postgres непрямого не поддерживает вычисляемые столбцы. Существуют различные более громоздкие обходные пути, некоторые из них предлагают here от Erwin Brandstetter.

+3

Следует, наверное, отметить, что это _not_ вычисленный столбец, поэтому для любых новых записей в таблице необходимо будет включить одну и ту же конкатенацию для заполнения нового столбца. Лучше всего создать представление по таблице, чтобы (а) автоматически соединить и (б) не хранить избыточные данные. – Nicarus

0

Это не точно отвечает на ваш вопрос, но я думаю, что он выполнит то же самое. Конечно, есть накладные расходы с помощью триггеров, но вместо создания представления я не уверен, как это сделать, когда происходит DML.

CREATE OR REPLACE FUNCTION tablename_insert_update_trigger() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 
    new."NameColumn" = concat(ColumnA, ColumnB, ColumnC); 
    return new; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

А затем установить, срабатывающие в любое время ваша таблица модифицируется:

CREATE TRIGGER insert_tablename_trigger 
    BEFORE INSERT 
    ON "TableName" 
    FOR EACH ROW 
    EXECUTE PROCEDURE tablename_insert_update_trigger(); 

CREATE TRIGGER update_tablename_trigger 
    BEFORE UPDATE 
    ON "TableName" 
    FOR EACH ROW 
    EXECUTE PROCEDURE tablename_insert_update_trigger(); 

Тем не менее, я думаю, что в большинстве случаев @ предложение Nicarus о целях является путь. Единственной альтернативой, где триггер будет предпочтительнее, является то, что функция на самом деле довольно сложна (вычислительно дорого), а DML происходит либо редко, либо в непиковые часы, тогда как чтение происходит часто и/или в часы пик.

Ваш пример был простым concat, но, возможно, это был условный пример с целью иллюстрации концепции, поэтому возьмите это за то, что это стоит.

Смежные вопросы