将列添加到表并立即将数据添加到PostgreSQL中的列

Mat*_*t P 5 sql postgresql alter-table sql-insert

我正在尝试在现有表中创建一个新列,并使用select语句进行除法以创建我想要插入到我的新列中的数据.我写的几个语句将作为单独的查询工作,但我无法将语句串在一起形成一个查询.

我仍在学习SQL并将其与mySQL和PostgreSQL一起使用.我上个月上了一堂关于SQL的课,现在我正在尝试做自己的项目以保持我的技能.

我正在做一些有关2012年在MN的选举结果的工作,以便在我的表格中使用,以了解我正在使用的数据.

我已经能够改变我的表并使用它们自己添加这些语句的新列.

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2)
ALTER TABLE mn2012ct_geom2 ADD COLUMN romney_pct decimal(10,2)
Run Code Online (Sandbox Code Playgroud)

我能够使用这个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
Run Code Online (Sandbox Code Playgroud)

现在我希望将这些信息添加到我创建的新列中,或者使用上面的Alter表语句,或者如果我在此查询之前创建列,则使用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);
Run Code Online (Sandbox Code Playgroud)

或者像这一行使用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);
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,它会发出如下错误:

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

我认为那种Alter表和添加列或插入将起作用,因为当我使用相同的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);   
Run Code Online (Sandbox Code Playgroud)

对您的任何帮助都可以提供,我将不胜感激.我一直在尝试google并在stackoverflow上搜索,以找到答案,但我找到的所有内容似乎都不适合我正在做的事情.

Cra*_*ger 8

通常,将计算数据添加到表中并不是一个好主意.在重新规范化表时,有时需要这样做,但通常不会这样做.

正如戈登所说,这里适当的做法是创建一个视图.请参阅教程.

没有ALTER TABLE ... ADD COLUMN ... AS.您不仅可以编写语法,还需要查看您感兴趣的命令文档,以了解如何使用它.该\h命令psql也是有用的,例如\h alter table.

如果确实需要在基于其他列计算新列设置值,使用ALTER TABLE ... ADD COLUMN ... DEFAULT ...,然后DROPDEFAULT创建后列项.通常最好将列空白并为空,然后用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;
Run Code Online (Sandbox Code Playgroud)

或者,有点丑陋:

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;
Run Code Online (Sandbox Code Playgroud)