SQL - 省略重复 table 名称

SQL - omit repeating the table name

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

有没有办法做到这一点而不必重复两个 table 的名字(谁同名?)

假设原来table的名字是public.student

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

现在我想要确切的 table 但我希望它在 test.student 我知道我会通过

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

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

我是 SQL 的新手,非常感谢您的帮助!我查看了函数,但无法使其正常工作。

您可以使用动态 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(对于 identifier)是安全的。 (嵌套的</code>、<code>是格式输入的顺序引用)

参见:

  • Define table and column names as arguments in a plpgsql function?
  • Table name as a PostgreSQL function parameter