Добавление столбца в таблицу и добавление данных сразу в столбец в PostgreSQL


Я пытаюсь создать новый столбец в существующей таблице и использую оператор select, чтобы сделать разделение для создания данных, которые я хочу вставить в свой новый столбец. Некоторые из выписанных мною операторов будут работать как отдельные запросы, но я не смог связать их в один запрос.

Я все еще изучаю SQL и использую его с mySQL и PostgreSQL. В прошлом месяце я ходил на курсы по SQL, и теперь я пытаюсь делать свои собственные проекты, чтобы сохранить свои навыки. острый. Я провожу некоторую работу с результатами выборов 2012 года в МН, чтобы использовать их в своих таблицах, чтобы понять данные, с которыми я работаю. Я смог изменить свою таблицу и добавить новый столбец с этими операторами, используя их самостоятельно.
ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2)
ALTER TABLE mn2012ct_geom2 ADD COLUMN romney_pct decimal(10,2)

Я смог использовать этот оператор select для получения нужной мне информации в моем терминальном приложении. То, что я пытаюсь сделать здесь, - это создать десятичное число из числа голосов, которые кандидат получил за общее число голосов. это был актерский состав.

SELECT CAST (obama AS DECIMAL) / CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2

SELECT CAST (romney AS DECIMAL) / CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2

Теперь я хочу, чтобы эта информация добавлялась в новый столбец, который я создал, либо с помощью инструкции Alter table, как я сделал выше, либо с помощью инструкции insert, если я создаю столбец до этого запроса.

Я попробовал такой комбинированный запрос:

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS
(SELECT CAST (obama AS DECIMAL (10,2)) / CAST (uspres_total AS DECIMAL (10,2)) 
AS obama_pct FROM mn2012ct_geom2);

Или с помощью команды Insert, подобной этой строке, вместо оператора alter table

INSERT INTO mn2012ct_geom2 (romney_pct) AS
(SELECT CAST (romney AS DECIMAL (10,2)) / CAST (uspres_total AS DECIMAL (10,2)) 
AS romney_pct FROM mn2012ct_geom2);

Когда я пытаюсь это сделать, он выдает ошибку, подобную этой:

ERROR:  syntax error at or near "AS"
LINE 1: ...mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS (SELECT...

Я так и думал. Alter table и add column или insert будут работать, так как этот тип формата работал, когда я создавал новую таблицу с помощью той же инструкции select.

CREATE TABLE obama_pct AS (SELECT CAST (obama AS DECIMAL (10,2)) / CAST (uspres_total     
AS DECIMAL (10,2)) AS obama_pct FROM mn2012ct_geom2);   
Любую помощь, которую вы можете оказать, я буду очень признателен. Я пытался гуглить и искать здесь на stackoverflow, чтобы найти ответ, но ни один из того, что я нашел, кажется, точно соответствует тому, что я делаю.
2 3

2 ответа:

В общем случае добавлять вычисленные данные в таблицу не очень хорошая идея. Иногда это нужно делать при повторной нормализации таблиц, но обычно это не делается.

Как говорит Гордон, здесь уместно было бысоздать представление . Смотритеучебник .

Нет никакого ALTER TABLE ... ADD COLUMN ... AS. Вы не можете просто придумать синтаксис, вам нужно посмотреть документацию для команды, которая вас интересует, чтобы узнать, как ее использовать. Команда \h в psql является также полезно, например \h alter table.

Если вам нужно задать значения в новом столбце на основе вычислений из других столбцов, используйте ALTER TABLE ... ADD COLUMN ... DEFAULT ... затем DROP термин DEFAULT после создания столбца. Часто лучше создать столбец пустым и nullable, а затем заполнить его оператором UPDATE.

Например, непроверенные примеры:

BEGIN;

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2);

UPDATE mn2012ct_geom2  SET romney_pct = CAST (romney AS DECIMAL (10,2)) / CAST (uspres_total AS DECIMAL (10,2);

COMMIT;

Или, несколько уродливее:

BEGIN;

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) NOT NULL DEFAULT (CAST (obama AS DECIMAL (10,2)) / CAST (uspres_total AS DECIMAL (10,2));

ALTER TABLE mn2012ct_geom2 ALTER COLUMN obama_pct DROP DEFAULT;

COMMIT;

Я думаю, что вы ищете утверждение update. Например:

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2);

update mn2012ct_geom2
    set obama_pct = CAST(obama AS DECIMAL) / CAST(uspres_total AS DECIMAL);

Вы также можете просто создать представление для выполнения вычисления:

create view v_mn2012ct_geom2 as
    select g.*, CAST(obama AS DECIMAL) / CAST(uspres_total AS DECIMAL) as mn2012ct_geom2
    from mn2012ct_geom2;