sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL:UPDATEは、パーティション間を移動することを意味します

    動作させることができます。移動を行うトリガーは、テーブル全体ではなく、パーティションごとに定義する必要があります。したがって、テーブル定義とINSERTトリガーの場合と同じように開始します

    CREATE TABLE records (
     record varchar(64) NOT NULL,
     active boolean default TRUE
    );
    
    CREATE TABLE active_records (CHECK (active)) INHERITS (records);
    CREATE TABLE inactive_records (CHECK (NOT active)) INHERITS (records);
    
    CREATE OR REPLACE FUNCTION record_insert()
    RETURNS TRIGGER AS $$
    BEGIN
      IF (TRUE = NEW.active) THEN
        INSERT INTO active_records VALUES (NEW.*);
      ELSE
        INSERT INTO inactive_records VALUES (NEW.*);
      END IF;
      RETURN NULL;
    END;
    $$
    LANGUAGE plpgsql;
    
    CREATE TRIGGER record_insert_trigger
     BEFORE INSERT ON records
     FOR EACH ROW EXECUTE PROCEDURE record_insert();
    

    ...いくつかのテストデータを用意しましょう...

    INSERT INTO records VALUES ('FirstLittlePiggy', TRUE);
    INSERT INTO records VALUES ('SecondLittlePiggy', FALSE);
    INSERT INTO records VALUES ('ThirdLittlePiggy', TRUE);
    INSERT INTO records VALUES ('FourthLittlePiggy', FALSE);
    INSERT INTO records VALUES ('FifthLittlePiggy', TRUE);
    

    これで、パーティションのトリガーになります。 if NEW.active =OLD.activeチェックは、最初にテーブルに何が許可されているかがわかっているため、activeの値のチェックに暗黙的に含まれています。

    CREATE OR REPLACE FUNCTION active_partition_constraint()
      RETURNS TRIGGER AS $$
        BEGIN
          IF NOT (NEW.active) THEN
            INSERT INTO inactive_records VALUES (NEW.*);
            DELETE FROM active_records WHERE record = NEW.record;
            RETURN NULL;
          ELSE
            RETURN NEW;
          END IF;
        END;
        $$
        LANGUAGE plpgsql;
    
    CREATE TRIGGER active_constraint_trigger
      BEFORE UPDATE ON active_records
      FOR EACH ROW EXECUTE PROCEDURE active_partition_constraint();
    
    CREATE OR REPLACE FUNCTION inactive_partition_constraint()
      RETURNS TRIGGER AS $$
        BEGIN
          IF (NEW.active) THEN
            INSERT INTO active_records VALUES (NEW.*);
            DELETE FROM inactive_records WHERE record = NEW.record;
            RETURN NULL;
          ELSE
            RETURN NEW;
          END IF;
        END;
        $$
        LANGUAGE plpgsql;
    
    CREATE TRIGGER inactive_constraint_trigger
      BEFORE UPDATE ON inactive_records 
      FOR EACH ROW EXECUTE PROCEDURE inactive_partition_constraint();
    

    ...そして結果をテストします...

    scratch=> SELECT * FROM active_records;
          record      | active 
    ------------------+--------
     FirstLittlePiggy | t
     ThirdLittlePiggy | t
     FifthLittlePiggy | t
    (3 rows)
    
    scratch=> UPDATE records SET active = FALSE WHERE record = 'ThirdLittlePiggy';
    UPDATE 0
    scratch=> SELECT * FROM active_records;
          record      | active 
    ------------------+--------
     FirstLittlePiggy | t
     FifthLittlePiggy | t
    (2 rows)
    
    scratch=> SELECT * FROM inactive_records;
          record       | active 
    -------------------+--------
     SecondLittlePiggy | f
     FourthLittlePiggy | f
     ThirdLittlePiggy  | f
    (3 rows)
    



    1. MySqlで複数の列をフィルタリングして複数の数を制限するにはどうすればよいですか?

    2. Mac OS 10.6(Snow Leopard)、10.7(Lion)、10.8(Mountain Lion)でPHPとMySQLをアクティブ化する最も簡単な方法は?

    3. 日付をMYSQL日付形式に変換する

    4. PHPでMySQLの結果を反復処理しながら、将来の重複値を検出する