Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何使用Postgres触发器对一个表中的两列进行双重写入?_Database_Postgresql_Triggers_Locking - Fatal编程技术网

Database 如何使用Postgres触发器对一个表中的两列进行双重写入?

Database 如何使用Postgres触发器对一个表中的两列进行双重写入?,database,postgresql,triggers,locking,Database,Postgresql,Triggers,Locking,我想更改PostgreSQL中的列类型。假设从INT到VARCHAR。安全的方法如下: 添加一个新列new. 对两列进行双重写入(例如,在插入/更新触发器之前使用) 使用旧列值的副本回填新列 在单个事务和显式的LOCK语句中,将重命名为old和new 删除旧列 问题是如何在插入/更新触发器之前创建它?(2) 在本例中使用一个简单的表foo CREATE TABLE foo (id int, idstr varchar); 创建一个简单函数,为新列指定值idstr CREATE OR REPLA

我想更改PostgreSQL中的列类型。假设从INT到VARCHAR。安全的方法如下:

  • 添加一个新列
    new.
  • 对两列进行双重写入(例如,在插入/更新触发器之前使用
  • 使用旧列值的副本回填新列
  • 在单个事务和显式的
    LOCK
    语句中,将
    重命名为
    old
    和new
  • 删除旧列

  • 问题是如何在插入/更新触发器之前创建它?(2)

    在本例中使用一个简单的表foo

    CREATE TABLE foo (id int, idstr varchar);
    
    创建一个简单函数,为新列指定值idstr

    CREATE OR REPLACE FUNCTION bluegreen ()
            RETURNS trigger LANGUAGE plpgsql AS $$
    BEGIN
      IF NEW.idstr IS NULL THEN
        NEW.idstr = NEW.id::varchar;
      END IF;
      IF NEW.id IS NULL THEN
        NEW.id = NEW.idstr::int;
      END IF;
      RETURN NEW;
    END;
    $$;
    
    并使用先前创建的函数在表上创建触发器

    CREATE TRIGGER foo_trg
        BEFORE INSERT OR UPDATE ON foo
        FOR EACH ROW
        EXECUTE PROCEDURE bluegreen();
    

    有关触发器的详细信息

    为什么不?:
    ALTER TABLE some_TABLE ALTER COLUMN使用_col::varchar
    根据表大小,您将锁定表一段时间