SQL - 省略重复表名

Posted

技术标签:

【中文标题】SQL - 省略重复表名【英文标题】:SQL - omit repeating the table name 【发布时间】: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 的最新版本 【参考方案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 是对格式输入的序号引用)

见:

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

【讨论】:

谢谢你,这行得通!我也会更深入地研究您提供的资源。谢谢:)

以上是关于SQL - 省略重复表名的主要内容,如果未能解决你的问题,请参考以下文章

SQl查询数据库表名表的列名数据类型主键

SQL语句优化系列三(关于select查询)

SQL - 省略重复表名

MySQLbase

MYSQL 数据库名表名字段名查询

MySQL数据库建库时SQL语句中数据库名表名用引号的问题以及COLLATE utf8_general_ci的含义