假设我想从SQL(postgres(中的现有表创建一个新表。我希望新表与旧表具有相同的名称,但希望它在不同的模式中。
有没有一种方法可以做到这一点,而不必重复两个表的名称(谁共享一个名称?(
假设原始表的名称是public.student
CREATE TABLE student(
student_id INT PRIMARY KEY,
last_name VARCHAR(30),
major VARCHAR(30))
现在我想要确切的表格,但我希望它在测试中我知道我会";克隆";通过
CREATE TABLE test.student AS
SELECT *
FROM public.student;
但我想写这篇文章,而不必重复写";学生";。有没有办法为此编写函数?
我是SQL的新手,所以我很感谢大家的帮助!我研究了函数,但没能让它发挥作用。
您可以使用动态SQL:创建过程(或函数(
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注入。带有格式说明符%I
(用于标识符(的format()
是安全的。(嵌套的$1
、$2
是对格式输入的顺序引用(
参见:
- 在plpgsql函数中将表名和列名定义为参数
- 表名作为PostgreSQL函数参数