17

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

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

在坚持之前,我想EXAMPLE被小写。example

4

2 回答 2

26

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

于 2013-09-22T02:42:00.700 回答
1

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

于 2013-09-15T01:19:36.363 回答