我有一个触发函数:
CREATE OR REPLACE FUNCTION Day_21_bankTriggerFunction()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
DECLARE
act VARCHAR(30);
BEGIN
SELECT account_number INTO act
DELETE FROM depositor
WHERE depositor.account_number = act;
RETURN act;
END;
$$;
`
然后我有一个触发器:
CREATE TRIGGER Day_21_bankTrigger AFTER DELETE on account FOR EACH ROW EXECUTE PROCEDURE Day_21_bankTriggerFunction()
这背后的想法是,如果从帐户表中删除了一个帐户,那么这应该触发函数运行,然后删除该帐户所在的存款人表上的所有记录。
我可以创建触发器函数和触发器而不会出现问题,但如果我试图从帐户表中删除帐户。。。当我不该看到的时候,我仍然会在储户表上看到账号。
有什么想法吗?
以上是我尝试过的。预期的结果是从账户表中删除一个账户,然后触发功能应该启动并从存款人表中删除该账户
通常,表之间的任何模式的关系都是由外键创建的。这是最好的方式,也是数据库的标准。使用外键可以控制数据。SQL示例:
CREATE TABLE contacts(
contact_id INT GENERATED ALWAYS AS IDENTITY,
customer_id INT,
contact_name VARCHAR(255) NOT NULL,
email VARCHAR(100),
PRIMARY KEY(contact_id),
CONSTRAINT fk_customer
FOREIGN KEY(customer_id)
REFERENCES customers(customer_id)
ON DELETE SET NULL
ON UPDATE SET NULL
);
第三,指定REFERENCES
子句中外键列引用的父表和父键列。
最后,在ON DELETE
和ON UPDATE
子句中指定删除和更新操作。删除和更新操作决定删除和更新父表中的主键时的行为。由于主键很少更新,因此ON UPDATE
操作在实践中并不经常使用。我们将重点讨论ON DELETE
行动。PostgreSQL在更新或删除后支持以下操作:
- SET NULL(如果引用表上存在数据,则将值设置为
NULL
( - SET DEFAULT(如果引用表上存在数据,则将该字段的值设置为
DEFAULT VALUES
( - RESTRICT(类似于
NO ACTION
( - NO ACTION(如果引用表上存在数据,则无法更新或删除数据(
- CASCADE(如果引用表上存在,则删除所有数据(
我为您编写了一个示例触发函数:
CREATE OR REPLACE FUNCTION Day_21_bankTriggerFunction()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
act varchar(30);
begin
-- get account_number from deleted record
act = old.account_number;
-- SECTION-1 :: Protect deleting if existing data
if (exists(select 1 from depositor where account_number = act)) then
return null;
end if;
-- SECTION-1 :: END
-- SECTION-2 :: Delete all data in the anothers table if exists */
delete from depositor where account_number = act;
return old;
-- SECTION-2 :: END
end
$function$;
CREATE TRIGGER Day_21_bankTrigger
BEFORE DELETE on account
FOR EACH ROW EXECUTE PROCEDURE Day_21_bankTriggerFunction();
在我的触发器函数中,我编写了两种类型的SQL代码。(SECTION-1
,SECTION-2
(。你必须从中选择一个。