admin

PostgreSQL 如果不存在则创建表

sql

在 MySQL 脚本中,您可以编写:

CREATE TABLE IF NOT EXISTS foo ...;

… 其他的东西 …

然后您可以多次运行脚本而无需重新创建表。

你如何在 PostgreSQL 中做到这一点?


阅读 431

收藏
2021-07-01

共1个答案

admin

此功能已Postgres 9.1 中实现

CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);

对于旧版本,这里有一个功能可以解决它:

CREATE OR REPLACE FUNCTION create_mytable()
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF EXISTS (SELECT FROM pg_catalog.pg_tables 
              WHERE  schemaname = 'myschema'
              AND    tablename  = 'mytable') THEN
      RAISE NOTICE 'Table myschema.mytable already exists.';
   ELSE
      CREATE TABLE myschema.mytable (i integer);
   END IF;
END
$func$;

称呼:

SELECT create_mytable();        -- call as many times as you want. 

笔记:

  • schemanametablenameinpg_tables区分大小写。如果在CREATE TABLE语句中双引号标识符,则需要使用完全相同的拼写。如果不这样做,则需要使用小写字符串。
  • pg_tables只包含实际。该标识符可能仍被相关对象占用。、
  • 如果角色执行此功能不具备必要的权限,以创建表,你可能想使用SECURITY DEFINER的功能,使其拥有与必要的权限另一个角色。这个版本足够安全。
2021-07-01