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
假设我想从 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 我知道我会通过
“克隆”tableCREATE 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