【问题标题】:Create a Postgres rule or trigger to automatically convert a column to lowercase or uppercase on insert创建 Postgres 规则或触发器以在插入时自动将列转换为小写或大写
【发布时间】:2013-09-15 00:23:34
【问题描述】:

如何在 postgres 中创建规则以在插入时强制 X 列小写。 EG 插入时:

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

我希望在坚持之前将EXAMPLE 小写为example

【问题讨论】:

  • 为什么你的规则的一部分使用NEW.foo而另一部分只使用foo
  • postgres 新手,正在猜测解决方案。没有新的试过了,还是报错:/
  • 另外,ascii() 仅适用于字符串中的第一个字符。
  • 两件事:1)。什么版本的 Postgres,2)。是大写还是小写取决于输入,还是 all 输入需要一个或另一个?如果是后者,BEFORE INSERT 触发器可能就是您所追求的。
  • 显然,检查输入的大小写会产生开销,但如果您不需要,那么将它们 all 转换为大写或小写都可以。如果您想进行基准测试,尝试通过触发器加载一百万行(有和没有检查),您应该能够快速确定开销。我的即兴建议是应用大写或小写函数,无论输入的大小写如何。我没有看到任何预计的每秒操作数,但如果您只期望每秒几十个,我会选择应用上/下函数,而不管输入情况如何。

标签: postgresql


【解决方案1】:

此解决方案已经过测试,可在 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 列中的唯一行现在设置为“小写我”

【讨论】:

  • 是否可以使lower_foo_on_insert() 动态化?例如,lower_on_insert('foo')
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,虽然我仍然无法让它工作。上述规则从未真正奏效。当我尝试插入任何内容时,我用当前遇到的错误更新了帖子:错误:在关系“foobar”的规则中检测到无限递归
  • 啊。那将是有用的信息;)
  • 是的:/该规则以前不起作用,我什至无法接受它,直到您建议删除 WHERE 语句。所以我刚开始遇到这个新错误。无论如何都要进步;)
猜你喜欢
  • 2017-05-28
  • 2016-06-25
  • 1970-01-01
  • 2012-02-21
  • 2017-05-18
  • 2016-01-22
  • 2019-05-15
  • 2018-09-07
  • 2017-06-30
相关资源
最近更新 更多