首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在postgresql中使用for循环创建多个表

问如何在postgresql中使用for循环创建多个表
EN

Stack Overflow用户
提问于 2012-12-12 14:18:12
回答 1查看 3.5K关注 0票数 2

如何在postgresql中使用for循环创建多个表?

例如:我需要创建c_emloyee、r_employee、i_employee等。

代码语言:javascript
复制
! /bin/sh

#Invoke postgre
 SQLVARCHAR="varchar"
 SQLINTEGER="integer"
 SQLBIGINT="bigint"
 SQLSMALLINT="smallint"
 SQLTINYINT="smallint"
 SQLCIDR="cidr"
 SQLBINARY="varbinary"
 SQLTIME="timestamp"
 SQLMACADDRESS="macaddr"
 prefix[0]=c_
 prefix[1]=r_
 prefix[2]=s_
 prefix[3]=i_
 echo ${prefix[0]}
 echo ${prefix[1]}
 echo ${prefix[2]}
 echo ${prefix[3]}

 psql -d postgres <<EOF
 BEGIN 
 FOR i IN 0 1 2 3 LOOP 
 create table ${prefix[i]}employee (e_name $SQLVARCHAR(32) primary key, type $SQLTINYINT not null, description $SQLVARCHAR(128), ip_address $SQLCIDR);
 END LOOP;
 END;
EN

回答 1

Stack Overflow用户

发布于 2012-12-12 23:40:17

你犯了两个错误:

  • FOR、BEGIN ... END等是PL/PgSQL的一部分,而不是常规SQL。您不能在普通SQL中使用这些,您需要一个DO块或CREATE OR REPLACE FUNCTION。
  • 你对评价的顺序搞糊涂了。您已经在i上编写了PL/PgSQL FOR循环,然后在bash变量展开中引用i。在生成PL/PgSQL函数文本时,在变量i存在之前就会扩展它。

如果您只需将psql -d postgres替换为cat,则可以清楚地看到后一个问题,因此它将打印您要运行的生成的SQL:

代码语言:javascript
复制
 BEGIN
 FOR i IN 0 1 2 3 LOOP
 create table c_employee (e_name varchar(32) primary key, type smallint not null, description varchar(128), ip_address cidr);
 END LOOP;
 END;

如您所见,${prefix[i]}计算为c_,因为未定义的i被bash视为零。因此,您的prefix数组中的其他条目将永远不会被使用。

你需要:

  • 使用DO块或CREATE OR REPLACE FUNCTION以及函数调用来执行PL/PgSQL代码;
  • 使用EXECUTE format(...)运行动态SQL

或者,您可以在一个CREATE TABLE循环中生成普通的bash语句,完全消除了PL/PgSQL的需求。我会使用这种方法,因为它要简单得多。

代码语言:javascript
复制
for p in ${prefix[*]}; do
  echo "create table ${p}employee (e_name $SQLVARCHAR(32) primary key, type $SQLTINYINT not null, description $SQLVARCHAR(128), ip_address $SQLCIDR);"
done | psql

顺便说一句,没有像postgre这样的东西。我想你的意思是"Postgres“或"PostgreSQL”。

你可能想要bytea而不是varbinary。不管怎么说,SQL类型作为变量是什么?你想要写一个DDL生成系统吗?如果是这样的话,不要重新发明那个轮子,那里已经有很多轮子了。

而且,如果您正在做这样的事情,那么您很有可能需要阅读模式(如果您试图做多租户)、表分区等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13841773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档