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 - 省略重复表名的主要内容,如果未能解决你的问题,请参考以下文章