【问题标题】:Create a trigger function in Postgres that doesn't let you have two entries with the same id在 Postgres 中创建一个触发器函数,它不允许您有两个具有相同 id 的条目
【发布时间】:2020-06-06 17:49:36
【问题描述】:

我在 postgres 中有两个表, 我想创建一个函数,该函数在借贷表中没有超过 2 个具有相同人员 ID 的贷款。 示例:在贷款表中,我不能有 3 笔来自同一个人的贷款,即我们用同一个人的 id 贷款。

我需要使用一个函数来做这件事,我把我想要做的,但它没有工作

CREATE TABLE person (
    name_person varchar (100) ,
    id_person varchar(14) primary key
)

CREATE TABLE lending(
    id_lending primary key (100) ,
    id_publication (14) FK,
    id_person fk REFERENCES id_person (person)




CREATE OR REPLACE FUNCTION check_numlending() 
RETURNS trigger AS 
$BODY$ 
BEGIN 
IF( select * from lending
   inner join person 
   on person.id_person = lending.id_person > 2  ) THEN 
    RAISE EXCEPTION 'ERROR'; 
END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 


-- Trigger
CREATE TRIGGER  
trg_check_num_lending  
BEFORE INSERT OR UPDATE ON 
lendingFOR EACH ROW EXECUTE PROCEDURE check_numlending(); 

【问题讨论】:

  • NEW.id_person = person.id_person > 2 应该做什么?如果要对现有表数据进行某些条件验证,需要在函数内部执行SELECT
  • 你好,我修复了这部分,我想要的差不多就是那个......但是如何检查借贷表中的id_person是否超过两倍?
  • 好吧,如果您想了解查询结果中有多少行,通常使用SELECT COUNT(*)... 建议您先学习 SQL 的基础知识;否则,您将很难编写 DB 过程和函数
  • 我现在知道了,感谢您帮助我解决问题

标签: sql postgresql function


【解决方案1】:

如下编写你的触发函数:

-- Function
CREATE OR REPLACE FUNCTION check_numlending() 
RETURNS trigger AS 
$BODY$ 
declare counter int;
BEGIN 
select count(*) into counter from lending where id_person =new.id_person;
IF( counter>=2  ) THEN 
    RAISE EXCEPTION 'ERROR'; 
END IF; 
RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 


-- Trigger
CREATE TRIGGER  
trg_check_num_lending  
BEFORE INSERT OR UPDATE ON 
lending FOR EACH ROW EXECUTE PROCEDURE check_numlending(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多