【发布时间】:2015-02-02 14:41:19
【问题描述】:
我正在尝试在具有多个列的架构中创建一个新表,这些列通过索引命名。
CREATE TABLE rflux (pk SERIAL PRIMARY KEY NOT NULL);
现在我想添加新的列,如 col0 FLOAT、col1、col2、col3、...直到 colN。
我知道我可以做类似的事情
ALTER TABLE rflux add column col0 FLOAT add column col1 FLOAT ... ;
但我不想输入所有内容,因为我需要创建 ~4500 列。我正在尝试使用循环来实现这一点,但我无法让它正常工作。有没有人有任何想法?我已经尝试创建一个函数来执行此操作..
create function addColumns()
returns void
as $$
begin
for i in 1..10 loop
alter table rflux add column tmp float;
alter table rflux rename tmp to col||i;
end loop;
return;
end;
$$
language plpgsql;
然后做 select * from addColumns();
但是在将列重命名为 col||i 时出现错误,甚至只是在我尝试 i 时出现错误。我什至不确定这是否是最好的方法。如何添加多个列,以便使用计数器递增列的名称?
编辑..我知道我不能用 4500 列来做到这一点,但是如果我想用 10 列来解决这个问题,比如说?
谢谢。
【问题讨论】:
-
4500 列??我认为您可能需要考虑重新设计架构,而不是将糟糕的设计硬塞到数据库中。但是,要执行您想要的操作,您需要在存储过程中使用“动态 SQL”……但您可能不应该这样做。
-
我真正想要的是以某种方式将 4500 个元素的数组存储到数据库中。我可以将它作为 float[] 的一列存储,或者每个元素都是单独的列。我担心通过 SQLAlchemy 对数组进行访问和切片。据我了解,postgres 将数组存储为字符串元素 {1,2,3}。当 SQLAlchemy 读入它时,它会解析这个字符串并将其转换为元素列表。我将拥有数百万行数据,并且需要过滤数组的某些元素满足给定条件的行子集。所以我认为第二种方式会更好。
-
如果有一种方法可以将数组存储在单列中,但有一个使用 SQLAlchemy 的快速子集选择机制,该机制适用于数百万行,同时适用于多个同时用户,那么我会全力以赴。我才刚刚开始,所以不知道有什么可能。