【问题标题】:SQL - omit repeating the table nameSQL - 省略重复表名
【发布时间】:2022-01-18 22:11:46
【问题描述】:

假设我想从 SQL (postgres) 中的现有表创建一个新表。我希望新表与旧表同名,但我希望它位于不同的架构中。

有没有办法做到这一点,而不必重复两个表的名称(谁共享一个名称?)

假设原始表的名称是public.student

CREATE TABLE student(
    student_id INT PRIMARY KEY,
    last_name VARCHAR(30),
    major VARCHAR(30))

现在我想要准确的表格,但我希望它在 test.student 我知道我会通过

“克隆”该表
CREATE TABLE test.student AS 
SELECT * 
FROM public.student;

但我想写这个而不必重复写“学生”。 有没有办法为此编写函数?

我对 SQL 很陌生,所以我很感谢你的帮助!我查看了函数,但无法使其工作。

【问题讨论】:

  • 没有。否则数据库将不知道正在使用哪个表来创建另一个表。
  • 定义“重复”。你的意思是,你只想输入一次?并且始终是您的 Postgres 版本。
  • 是的,我只想写一次“学生”(这个名字实际上要复杂得多)。我使用的是 14.1 的最新版本

标签: sql postgresql function dry


【解决方案1】:

您可以使用动态 SQL 创建 procedure(或函数):

CREATE OR REPLACE PROCEDURE foo(_schema text, _table text)
    LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE format('CREATE TABLE %1$I.%2$I AS TABLE public.%2$I'
                , _schema, _table);
END
$func$;

呼叫:

CALL foo('test', 'student');

注意这里的标识符区分大小写!

警惕可能的 SQL 注入。 format() 带有格式说明符 %I(对于 标识符)是安全的。 (嵌套的$1$2 是对格式输入的序号引用)

见:

【讨论】:

  • 谢谢你,这行得通!我也会更深入地研究您提供的资源。谢谢:)
猜你喜欢
  • 2012-07-31
  • 2017-01-21
  • 2017-06-12
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2019-01-12
相关资源
最近更新 更多