在MySQL脚本中,您可以编写:
CREATE TABLE IF NOT EXISTS foo ...;
Run Code Online (Sandbox Code Playgroud)
... 其他的东西 ...
然后您可以多次运行该脚本而无需重新创建表.
你如何在PostgreSQL中做到这一点?
我想在Postgres函数中传递一个表名作为参数.我试过这段代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer
AS $$
BEGIN
IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
return 1;
END IF;
return 0;
END;
$$ LANGUAGE plpgsql;
select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
ERROR: syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
^
********** Error **********
ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)
以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:
ERROR: column tab.id does not exist
LINE 1: ...T EXISTS …Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中有一个简单的替代方法来生成Oracle中的这个语句吗?
select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;
Run Code Online (Sandbox Code Playgroud)
然后我测试查询是否返回任何内容以证明列存在.
我知道使用psql我可以单独找到这些,但这是在我编写的程序中生成结果以验证我的数据库表中存在请求的属性字段所必需的.
我正在寻找向填充有值的预先存在的表添加一个新列。新列将是NOT NULL,因此对于每个预先存在的行,它将需要一个值。
我正在寻找该列上的初始值,以在列创建时根据表中的其他值计算,并且仅在列创建时进行计算。
我有一个非常具体的用例,所以我不是在寻找解决方法。我将给出一个非常简单的例子来说明我正在寻找的内容:
说我有这个数据:
CREATE TABLE numbers (
value1 INTEGER NOT NULL,
value2 INTEGER NOT NULL
);
INSERT INTO numbers(value1, value2) VALUES (10, 20), (2, 5);
Run Code Online (Sandbox Code Playgroud)
我希望value3在numbers表上创建一个新列,该列在创建时始终等于其对应列value1和value2列的总和。
例如:
ALTER TABLE numbers ADD COLUMN value3 INTEGER;
/* ... some more logic which calculates the initial values ... */
ALTER TABLE numbers
ALTER COLUMN value3 SET NOT NULL;
Run Code Online (Sandbox Code Playgroud)
完成后,我想要以下数据:
-- The 3rd value will be the sum of the …Run Code Online (Sandbox Code Playgroud) postgresql ×4
create-table ×1
ddl ×1
dynamic-sql ×1
function ×1
identifier ×1
plpgsql ×1
sql ×1