Tengo un trabajo de flujo de aire que altera las columnas de mi tabla diariamente a través de la declaración INSERT ON CONFLICT. La tabla contiene un campo updated_mode de tipo enumeración que se establece en automático cuando la fila se inserta/actualiza por trabajo o manual si se hace manualmente. Ahora, quiero que mi trabajo actualice las filas solo si updated_mode está configurado en automático . ¿Cómo puedo hacer eso?
Básicamente, quiero hacer algo como:
Insert into table (data) values (data) on conflict (fields) if updated_mode=automatic set data=excluded.data else do nothingNecesita la cláusula WHERE en ON CONFLICT .
INSERT INTO table_data VALUES (data) ON CONFLICT (fields) DO UPDATE SET data=excluded.data WHERE EXCLUDED.updated_mode='automatic'Eche un vistazo a db fiddle: https://www.db-fiddle.com/f/qwRzRSFaJx4KDMYn2GEXTe/1
Debe utilizar la condición WHERE regular. El REGISTRO EXCLUIDO mágico contendrá un registro conflictivo existente. Algo como eso :
Insert into table (data) values (data) on conflict (fields) do update set data=excluded.data WHERE updated_mode=automatic and fields = EXCLUDEED.fieldsSupongo que los campos son el campo en conflicto y el nombre de la tabla es data
https://www.postgresql.org/docs/release/14.0/
- Permitir que los nombres de las columnas en la cláusula WHERE de ON CONFLICT se califiquen como tablas (Tom Lane)
Ahora puede hacer referencia más fácilmente a los nombres de las columnas excluidas y a las columnas de la tabla original.
montar la mesa.
create table test101(id bigint primary key, field1 text, update_mode boolean); insert into test101 values (1,'a', TRUE); insert into test101 values (2 ,'b', false);excluidos se refieren a la parte que desea insertar.
--this one will insert. insert into test101(id, field1,update_mode) values(1,'asdf', TRUE) on conflict (id) do update set field1 = excluded.field1 WHERE excluded.update_mode= test101.update_mode; --this will not insert insert into test101(id, field1,update_mode) values(2,'asdf', TRUE) on conflict (id) do update set field1 = excluded.field1 WHERE excluded.update_mode= test101.update_mode;