sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa en Postgres-regel eller utlösare för att automatiskt konvertera en kolumn till gemener eller versaler vid infogning

Denna lösning har testats och fungerar i Postgres 9.1

Jag använde triggers för att lösa problem.

Här är hela koden så att du kan klistra in i postgres och prova själv och förklaring av hur det fungerar nedan

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'

Skapa vår demotabell:

CREATE TABLE foobar (
    foo text,
    bar int
);

Skapa funktion som konverterar (foo) till gemener:

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;

Skapa en utlösare som kör kod till gemener foo innan du infogar:

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

Och nu för att testa vårt arbete:

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

Resultatet är att den enda raden i kolumn foo nu är inställd på 'små bokstäver'



  1. Vad är encode(<columnName>, 'escape') PostgreSQL-ekvivalenten i java?

  2. FrankenQueries:när SQL och NoSQL kolliderar

  3. 'syntaxfel vid slutet av inmatning' - när du försöker starta lagrad procedur från DB

  4. Inloggning fungerar endast för den sista användaren i databasen