【问题标题】:postgresql function that inserts and validates插入和验证的 postgresql 函数
【发布时间】:2020-03-19 19:54:26
【问题描述】:

我正在尝试创建一个函数,从表中插入一个新人并验证该人的性别(必须是“男性”或“女性”)。我知道如何创建一个插入新人的函数,并且我知道如何创建一个在性别现在是男性或女性时引发异常的函数。但我不知道如何在一个函数中不使用触发器来执行此操作。

我已经是这样的:

CREATE OR REPLACE FUNCTION InsertPerson(IN _id INTEGER, IN _name VARCHAR(50), IN _gender CHAR(1))
RETURNS void
AS 
$$

  BEGIN

    IF NEW.gender <> 'Female' AND NEW.gender <> 'Male' THEN
       RAISE EXCEPTION 'Gender must be either Female or Male';
    END IF;


    INSERT INTO Person (ID, name, gender)
    VALUES(_id, _name, _gender);


  END;
$$ LANGUAGE plpgsql;

谁能帮帮我

【问题讨论】:

  • 您是否考虑过使用枚举列而不是 varchar。这将自动只允许您指定的值。这也可能使您的数据库更快地进行搜索和引用,因为搜索/匹配字符串/字符相对较慢

标签: postgresql function if-statement insert


【解决方案1】:

我不会在函数中进行检查。如果有人绕过函数直接插入表格怎么办?检查约束会更好。

ALTER TABLE person
            ADD CHECK (gender IN ('Female', 'Male'));

如果您坚持使用该功能,只需检查_gender(如果它可以容纳FemaleMale,则应该超过一个字符)而不是new.gender

...
IF _gender <> 'Female'
   AND _gender <> 'Male' THEN
  RAISE EXCEPTION 'Gender must be either Female or Male';
END IF;
...

【讨论】:

  • 感谢您的回答。是的,我知道检查会更好,但我只是想看看我是否可以仅使用一个函数使其工作。我根据您的建议更改了函数,虽然它可以创建函数,但当我插入男性或女性以外的其他内容时,我没有收到引发异常消息:我想要的“性别必须是女性或男性”。 (我已经改变了 _gender 所以它现在有超过 1 个字符)..
  • @shiverrose:为我工作:dbfiddle.uk/…
  • aah okey,当我这样做时:SELECT InsertPerson(2, 'baz', 'Wrong');有用。但如果我这样插入它就不会: INSERT INTO Person(ID, name, gender) VALUES (2, 'baz', 'Wrong');然后它只是插入数据。
  • @shiverrose:当然,如果你只是INSERT。如果您只执行INSERT,您将绕过该功能。这正是我推荐 CHECK 约束时的意思。
猜你喜欢
  • 2017-11-24
  • 2015-12-30
  • 2011-02-26
  • 2023-03-31
  • 2016-01-09
  • 1970-01-01
  • 2013-01-14
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多