Postgresql 创建Postgres规则或触发器,以便在插入时自动将列转换为小写或大写

Postgresql 创建Postgres规则或触发器,以便在插入时自动将列转换为小写或大写,postgresql,Postgresql,如何在postgres中创建一个规则,在插入时强制X列使用小写。例如插入: INSERT INTO foobar (foo, bar) VALUES ('EXAMPLE', 2); 我希望在坚持之前将示例小写为示例。在更多信息后更新:尝试在插入后使用触发器强制将字段小写。此解决方案已经过测试,并且正在Postgres 9.1中运行 我用触发器来解决这个问题 下面是完整的代码,您可以将其粘贴到postgres中并自己试用&下面将解释它是如何工作的 DROP TABLE foobar; CREAT

如何在postgres中创建一个规则,在插入时强制X列使用小写。例如插入:

INSERT INTO foobar (foo, bar) VALUES ('EXAMPLE', 2);

我希望在坚持之前将
示例
小写为
示例

在更多信息后更新:尝试在插入后使用触发器强制将字段小写。

此解决方案已经过测试,并且正在Postgres 9.1中运行

我用触发器来解决这个问题

下面是完整的代码,您可以将其粘贴到postgres中并自己试用&下面将解释它是如何工作的

DROP TABLE foobar;
CREATE TABLE foobar (
foo text,
bar int
);

CREATE OR REPLACE FUNCTION lowecase_foo_on_insert() RETURNS trigger AS $lowecase_foo_on_insert$
    BEGIN        
        NEW.foo = LOWER(NEW.foo);
        RETURN NEW;
    END;
$lowecase_foo_on_insert$ LANGUAGE plpgsql;

CREATE TRIGGER lowecase_foo_on_insert_trigger BEFORE INSERT OR UPDATE ON foobar
    FOR EACH ROW EXECUTE PROCEDURE lowecase_foo_on_insert();

INSERT INTO foobar (foo, bar) VALUES ('LOWERCASE ME', 1);

SELECT * FROM foobar; //result 'lowercase me'
创建演示表:

CREATE TABLE foobar (
    foo text,
    bar int
);
创建将(foo)转换为小写的函数:

CREATE OR REPLACE FUNCTION lowecase_foo_on_insert() RETURNS trigger AS $lowecase_foo_on_insert$
    BEGIN        
        NEW.foo = LOWER(NEW.foo);
        RETURN NEW;
    END;
$lowecase_foo_on_insert$ LANGUAGE plpgsql;
创建一个触发器,在插入之前将代码执行为小写的foo:

CREATE TRIGGER lowecase_foo_on_insert_trigger BEFORE INSERT OR UPDATE ON foobar
    FOR EACH ROW EXECUTE PROCEDURE lowecase_foo_on_insert();
现在来测试我们的工作:

INSERT INTO foobar (foo, bar) VALUES ('LOWERCASE ME', 1);
SELECT * FROM foobar;

结果是foo列中的唯一一行现在被设置为“lowercase me”

为什么您的规则的一部分使用
NEW.foo
,而另一行只使用
foo
?对postgres来说是新的,并且正在猜测解决方案。在没有新字符的情况下尝试了它,但仍然得到了一个错误:/a另外,
ascii()
仅对字符串中的第一个字符有效。有两件事:1)。什么版本的博士后,2)。大写或小写取决于输入,还是所有输入都需要一个或另一个?如果是后一种情况,那么插入前触发器很可能就是您所追求的。显然,检查输入的大小写会有开销,但是如果您不需要,那么将它们全部转换为大写或小写就可以了。如果您想进行基准测试,尝试通过触发器加载一百万行(有检查和没有检查),您应该能够快速确定开销。我的即兴建议是应用大写或小写函数,而不管输入的情况如何。我没有看到任何预计的每秒运算计数,但是如果你只期望每秒几十次,我会选择应用上/下函数,不管输入大小写。谢谢你的回答,尽管我仍然无法让它工作。上述规则从未真正起作用。当我尝试插入任何东西时,我用当前得到的错误更新了帖子:错误:在关系“foobar”的规则中检测到无限递归。这将是有用的信息;)是的:/这个规则以前不起作用,我甚至无法让它接受它,直到你建议删除WHERE语句。所以我开始犯新的错误。无论如何都要进步;)是否可以使插入()上的
下\u foo\u成为动态的?e、 例如,
lower\u on\u insert('foo')