首页 > 解决方案 > 创建简单的删除函数 postgresql

问题描述

我是 PostgreSQL 的新手,我创建了一个带有插入函数的简单表,但是当我使用删除函数时,它会删除所有插入的查询,知道会发生什么吗?如果有人问,我也在使用 PostgreSQL v9.6

CREATE TABLE sample(
id SERIAL PRIMARY KEY,
sy char(9),
sem char(1)
);

CREATE FUNCTION insert(sy char,sem char)
returns void
AS
$$
Begin
insert into sample(sy,sem) values (sy,sem);
END;
$$
LANGUAGE 'plpgsql';

select insert('2011-2012','1');
select insert('2013-2014','2');
select insert('2015-2016','1');
select insert('2017-2018','2');

CREATE FUNCTION delete(id int)
returns bool
AS
$$
BEGIN
    EXECUTE 'delete from sample where id = id';
    RETURN true;
END;
$$
LANGUAGE 'plpgsql';

select delete(1);
select * from sample
id     sy          sem

标签: postgresqlpostgres-9.6

解决方案


delete from sample where id = idid删除 column等于 column的所有行id。由于这都是字符串的一部分,因此不会进行参数替换。但没有必要使用动态 SQL ( execute '...') 开头。为了避免列名和参数名之间的冲突,建议以某种方式区分它们。许多人通过为参数使用前缀来实现这一点。另外:语言名称是一个标识符,不应被引用。该语法已被弃用,可能会在未来的版本中被删除,所以不要习惯它。

因此,摆脱动态 SQL 并重命名您的参数:

CREATE FUNCTION delete(p_id int)
  returns bool
AS
$$
BEGIN
  delete from sample where id = p_id;
  return true;
END;
$$
LANGUAGE plpgsql;

推荐阅读