【问题标题】:Create loop to create PostgreSQL columns创建循环以创建 PostgreSQL 列
【发布时间】:2016-03-10 08:29:01
【问题描述】:

我在一个 csv 文件中有一个包含 320 列的数据集,其中标题只是行程的数量。

每一列代表一次旅行,一条从 A 到 B 的街道名称路线。 (这是一个简单的列表,我在 excel 中转置以创建行程编号作为头部。)

我想将它导入到 postgreSQL 表中。

我看到以前类似的question,但因为它只有 320,我想知道这是否是最好的结构,如果是的话,如何循环列创建以便通过 pgAdmin 插入数据。

到目前为止,我认为这会返回错误消息:

DO
$do$
BEGIN 
FOR i IN 1..320 LOOP
   INSERT INTO runs (col_i, col_id) -- use col names
   SELECT i, id
   FROM   tbl;
END LOOP;
END
$do$;

非常感谢

【问题讨论】:

    标签: sql excel postgresql loops csv


    【解决方案1】:

    根据您的数据类型,最大列数从 250 到 1600,所以这可能是个问题

    What is the maximum number of columns in a PostgreSQL select query

    如果您已经在excel中保存了数据,您可以使用另存为CSV并使用COPY导入数据

    https://stackoverflow.com/a/2987451/3470178

    或使用字符串连接在 excel 中创建 INSERT 语句。

    【讨论】:

    • 我确实尝试了复制,但它返回错误:错误:最后一个预期列 SQL 状态后的额外数据:22P04 上下文:复制运行,第 1 行:“1,2,3,4,5,6 ,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 ,32,33,34,35,36,3...”我假设是因为还没有确定列?我创建了表“运行”但没有列。我的数据是简单的文本,第一行标题可以是 INT。
    • Peter 尝试创建一个包含 10 列的小样本,以确保问题不在于列数并验证您有正确的 sintaxis。如果仍然出现 sintaxis 错误,您需要提供完整示例以便我们提供帮助。你需要在 csv 上创建列,我给你的链接告诉你如何。
    • 娟,我之前创建列的时候成功导入了3列。于是问题又来了:如何将 320 列创建为循环,以便导入 csv?
    • 列名是某种顺序吗?如果表存在,为什么不使用ALTER TABLE distributors ADD COLUMN address varchar(30); 手动创建列。如果表格不存在,如果 csv 有标题,我提供的链接将为您创建列。
    【解决方案2】:

    创建一个包含 320 个text 列的表:

    DO
    $$BEGIN
    EXECUTE (
       SELECT 'CREATE TABLE my_tbl (c'
            || string_agg(g::text, ' text, c')
            || ' text)'
       FROM generate_series(1,320) g);
    END$$;
    

    一个理智的关系设计可能是(疯狂的猜测,没有足够的信息):

    CREATE TABLE street (
      street_id serial PRIMARY KEY
    , street    text NOT NULL
    );
    
    CREATE TABLE trip (
      trip_id  serial PRIMARY KEY
    , whatever text
    );
    
    CREATE TABLE trip_step (
      trip_id   int REFERENCES trip
    , step      int
    , street_id int NOT NULL REFERENCES street
    , PRIMARY KEY (trip_id, step)
    );
    

    考虑:

    【讨论】:

    • 但是有这么多列的表通常是一个很大的误解。您确定您的意思不是 320 ,由 2 列或其他内容组成吗?
    • 谢谢欧文。也许我应该有一个不同的数据结构。你有什么建议?这些都是街道名称,因此数据类型相同,但每列代表一条单独的路线。
    • @Peter:没有足够的信息,我只能猜测。见更新。对于更多信息,我建议您提出一个关于设计的新问题,在其中提供所有必要的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多