官术网_书友最值得收藏!

Data cleaning

In the preceding code, we notice that employee names don't have consistent cases. It will be easy to enforce consistency by adding a constraint, as shown here:

CHECK (emp_name = upper(emp_name))

However, it is even better to just make sure that the name is stored as uppercase, and the simplest way to do this is by using trigger:

CREATE OR REPLACE FUNCTION uppercase_name () 
  RETURNS trigger AS $$
    BEGIN
        NEW.emp_name = upper(NEW.emp_name);
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER uppercase_emp_name
BEFORE INSERT OR UPDATE OR DELETE ON salaries
    FOR EACH ROW EXECUTE PROCEDURE uppercase_name ();

The next set_salary() call for a new employee will now insert emp_name in uppercase:

postgres=# SELECT set_salary('arnold',80);
-[ RECORD 1 ]-------------------
set_salary | INSERTED USER arnold

As the uppercasing happens inside a trigger, the function's response still shows a lowercase name, but in the database, it is uppercased:

postgres=# SELECT * FROM salaries;
-[ RECORD 1 ]---
emp_name | Bob
salary   | 1300
-[ RECORD 2 ]---
emp_name | Fred
salary   | 750
-[ RECORD 3 ]---
emp_name | Frank
salary   | 100
-[ RECORD 4 ]---
emp_name |  ARNOLD
salary   | 80

After fixing the existing mixed-case employee names, we can make sure that all employee names will be uppercased in the future by adding a constraint:

postgres=# update salaries set emp_name = upper(emp_name) where not emp_name = upper(emp_name);
UPDATE 3                                                        
postgres=# alter table salaries add constraint emp_name_must_be_uppercasepostgres CHECK (emp_name = upper(emp_name));
ALTER TABLE

If this behavior is needed in more places, it will make sense to define a new type – say u_text, which is always stored as uppercase. You will learn more about this approach in Chapter 14, PostgreSQL as Extensible RDBMS.

主站蜘蛛池模板: 普兰店市| 东乌珠穆沁旗| 交城县| 乡宁县| 察隅县| 康平县| 尼玛县| 盱眙县| 阿图什市| 增城市| 斗六市| 灵璧县| 咸阳市| 兰考县| 井陉县| 额济纳旗| 宿州市| 博白县| 安顺市| 西畴县| 丰原市| 花莲县| 琼结县| 铁力市| 建平县| 宁国市| 建阳市| 莆田市| 彰化县| 威信县| 汝阳县| 怀柔区| 旬邑县| 安岳县| 周口市| 陈巴尔虎旗| 塔河县| 霍林郭勒市| 图们市| 肇州县| 聂拉木县|