首页 文章

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

提问于
浏览
3

我正在尝试在现有表中创建一个新列,并使用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)

我能够使用这个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表语句或者如果我在此查询之前创建列,则使用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表和添加列或插入将起作用,因为当我使用相同的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);

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

2 回答

  • 3

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

    正如戈登所说,这里适当的做法是create a view . 见the tutorial .

    没有 ALTER TABLE ... ADD COLUMN ... AS . 你不能只是编写语法,你需要查看documentation for the command you're interested in以了解如何使用它 . psql 中的 \h 命令也很有用,例如 \h alter table .

    如果确实需要根据其他列的计算在新列中设置值,请在创建列后使用ALTER TABLE ... ADD COLUMN ... DEFAULT ...,然后使用 DROP DEFAULT 术语 . 通常最好将列空白并为空,然后用 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;
    
  • 5

    我想你正在寻找 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;
    

相关问题