database - Contrains únicos en Vertica DB
transactions unique-constraint (1)
Vertica no impone la exclusividad de la clave primaria o las restricciones únicas en la carga debido a la sobrecarga potencial asociada con la operación.
Si ANALYZE_CONSTRAINTS()
se ejecuta antes de la ANALYZE_CONSTRAINTS()
, debería poder capturar posibles duplicados. También hay sobrecarga con hacer UPDATE
y se deben evitar.
Hay formas de imponer la exclusividad en la carga, como usar MERGE
o organizar los datos en una tabla temporal. Cada método tiene sus propias limitaciones. Puede leer más sobre la aplicación de la exclusividad de los datos en mi publicación de blog .
Actualización: desde 7.2, Vertica puede aplicar automáticamente restricciones de clave primarias y únicas. Consulte la documentación para más información.
Descargo de responsabilidad: Mi conocimiento DB proviene principalmente de Mysql por lo que podría malinterpretar algunas cosas en vertica ...
Me gustaría saber si existe una técnica para insertar / actualizar valores en vertica mientras aplica restricciones exclusivas en varias sesiones. Supongamos que tengo una mesa:
''id'', ''unique_field'', ''some_filed''
Y hay una restricción única en unique_field. Según entiendo, en Vertica uno primero necesita hacer una inserción y luego hacer ANALYZE_CONSTRAINTS para verificar si la restricción fue violada. En mi caso específico, tengo varias sesiones preformando INSERTS en la misma tabla y pueden intentar presionar el mismo registro. La secuencia de una sola sesión parece ser:
Insert into table (id, unique_field, some_field) values (5, ''abc'', ''data'');
SELECT ANALYZE_CONSTRAINTS(table);
COMMIT;
Si ejecuto esta secuencia en dos sesiones separadas, existe la posibilidad de que ambas consultas intenten insertar el mismo campo_único y para cada una de ellas no se detectará ninguna violación de restricción ya que están en transacciones separadas, lo que dará como resultado datos duplicados.
¿Hay una mejor manera de evitar que esto suceda? O me estoy perdiendo algo.