Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中正确实现软删除?_Postgresql - Fatal编程技术网

如何在postgresql中正确实现软删除?

如何在postgresql中正确实现软删除?,postgresql,Postgresql,在我的postgres 9.3数据库中,我有以下功能和触发器的组合来实现软删除功能: ALTER TABLE "LIBN02"."trigger_test_1" ADD COLUMN delete_ind integer CREATE OR REPLACE FUNCTION trigger_test_1_soft_delete() RETURNS trigger AS $$ DECLARE command text := ' SET delete_ind = 1 W

在我的postgres 9.3数据库中,我有以下功能和触发器的组合来实现软删除功能:

ALTER TABLE "LIBN02"."trigger_test_1"
ADD COLUMN delete_ind integer

CREATE OR REPLACE FUNCTION trigger_test_1_soft_delete()  
  RETURNS trigger AS $$
    DECLARE
      command text := ' SET delete_ind = 1 WHERE uuid_col = $1';
    BEGIN
      EXECUTE 'UPDATE ' || "LIBN02"."trigger_test_1" || command USING OLD.uuid_col;
      RETURN NULL;
    END;
  $$ LANGUAGE plpgsql;

CREATE TRIGGER test_1_soft_delete_trigger  
  BEFORE DELETE ON "LIBN02"."trigger_test_1"
  FOR EACH ROW EXECUTE PROCEDURE trigger_test_1_soft_delete();
完成上述所有操作后,我运行以下delete语句:

DELETE FROM "LIBN02"."trigger_test_1"
我得到以下错误:

ERROR:  missing FROM-clause entry for table "LIBN02"
LINE 1: SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
                            ^
QUERY:  SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
CONTEXT:  PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE

********** Error **********

ERROR: missing FROM-clause entry for table "LIBN02"
SQL state: 42P01
Context: PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE

要使其正常工作,我应该更改什么?

您收到的错误是因为
LIBN02.“trigger\u test\u 1”
不是一个字符串(它们用单引号引起来),而是一个标识符。你应该使用

EXECUTE 'UPDATE "' || TG_TABLE_SCHEMA || '"."' || TG_TABLE_NAME || '" ' || command
   USING OLD.uuid_col;

您还可以在
WHERE
子句中添加
和不删除
,以避免不必要的搅动。

为什么要使用动态SQL。这完全没有必要,只需使用
更新“LIBN02”。trigger\u test\u 1 set delete\u ind=1,其中uuid\u col=OLD.uuid\u col请阅读此问题: