【问题标题】:Adding column to table & adding data right away to column in PostgreSQL将列添加到表并立即将数据添加到 PostgreSQL 中的列
【发布时间】:2013-09-01 06:15:21
【问题描述】:

我正在尝试在现有表中创建新列,并使用 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 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 语句,或者如果我在此查询之前创建列,则使用插入语句。

我尝试过这样的组合查询:

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);

或者使用类似这一行的插入命令代替 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 上搜索以找到答案,但我发现的所有内容似乎都不完全符合我正在做的事情。

【问题讨论】:

    标签: sql postgresql sql-insert alter-table


    【解决方案1】:

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

    正如 Gordon 所说,在这里做的适当的事情是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;
    

    【讨论】:

    • 感谢您的建议和帮助我学习。将仔细查看视图并了解它们是如何工作的。
    【解决方案2】:

    我认为您正在寻找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;
    

    【讨论】:

    • 感谢您的帮助并感谢您的评论。在看过 Craig 之后,我发现你遗漏了设置部分,以及为什么我一开始无法得到你的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2021-08-12
    • 2019-06-23
    • 1970-01-01
    • 2022-09-24
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多