Porque razón puede haberse creado (via sistema) una persona con el campo persona duplicado?
DETALLE: La llave (persona)=(34045) est▒ duplicada.
La orden era: ALTER TABLE ONLY negocio.mdp_personas
ADD CONSTRAINT pk_mdp_personas PRIMARY KEY (persona);
la única chance de arreglo es eliminarlas a las dos?
Buenos días Emilio, la única forma de que pase eso es haciendo un insert directamente sobre la tabla y al hacerlo incluir el id persona explicitamente.
Luego no actualizar la secuencia del campo persona.
Mirando en auditoria, vas a poder chequear si se hizo por base o por sistema.
SELECT
auditoria_usuario,
auditoria_fecha,
auditoria_operacion,
auditoria_id_solicitud
FROM
negocio_auditoria.mdp_personas
WHERE
persona = 34045;
Si el campo auditoria_id_solicitud es vacío y/o el campo auditoria_usuario es un usuario de la base, significa que lo han hecho por base la inserción.
Después por si acaso te ha quedado mal la secuencia es correr está query para actualizar ese valor.
SET search_path to negocio;
SELECT SETVAL('mdp_personas_seq', (SELECT MAX(persona) FROM mdp_personas));
Mi duda, ahora que reviso bien el código que posteas, es saber porque la tabla personas no tenía pk.
La forma de resolverlo podría ser quitando uno de los dos registros. Pero deberías saber si no está en otras tablas implicadas.
Con esta query podes obtener lo que me preguntaste.
select conname as "Foreign Key",
t1.relname as "Tabla que referencia",
a1.attname as "Columna que referencia",
t2.relname as "Tabla referenciada",
a2.attname as "Columna referenciada"
from pg_constraint as c,
pg_class as t1,
pg_class as t2,
pg_attribute as a1,
pg_attribute as a2
where t2.relname in ('mdp_personas')
-- and a2.attname = 'columna_referenciada'
-- and a2.attname <> a1.attname -- Para ver las referencias con nombres diferentes en las columnas relacionadas.
and c.conrelid = t1.relfilenode
and t2.relfilenode = c.confrelid
and a1.attrelid = t1.relfilenode
and a2.attrelid = t2.relfilenode
AND (
( c.conkey[1] = a1.attnum AND c.confkey[1] = a2.attnum ) OR
( c.conkey[2] = a1.attnum AND c.confkey[2] = a2.attnum ) OR
( c.conkey[3] = a1.attnum AND c.confkey[3] = a2.attnum ) OR
( c.conkey[4] = a1.attnum AND c.confkey[4] = a2.attnum ) OR
( c.conkey[5] = a1.attnum AND c.confkey[5] = a2.attnum ) OR
( c.conkey[6] = a1.attnum AND c.confkey[6] = a2.attnum ) OR
( c.conkey[7] = a1.attnum AND c.confkey[7] = a2.attnum ) OR
( c.conkey[8] = a1.attnum AND c.confkey[8] = a2.attnum ) OR
( c.conkey[9] = a1.attnum AND c.confkey[9] = a2.attnum ) OR
( c.conkey[10] = a1.attnum AND c.confkey[10] = a2.attnum )
)
order by 2
;
Con esto desactivas el chequeo de las fk. En la query, la primer columna ponelo antes de hacer algo con ese valor, y luego lo que dice correr_dsps.
Espero te sirva,
Saludos.
select 'ALTER TABLE ' || t1.relname || ' DISABLE TRIGGER ALL ;' as correr_anter,
'ALTER TABLE ' || t1.relname || ' ENABLE TRIGGER ALL; 'as correr_dsps
from pg_constraint as c,
pg_class as t1,
pg_class as t2,
pg_attribute as a1,
pg_attribute as a2
where t2.relname in ('mdp_personas')
-- and a2.attname = 'columna_referenciada'
-- and a2.attname <> a1.attname -- Para ver las referencias con nombres diferentes en las columnas relacionadas.
and c.conrelid = t1.relfilenode
and t2.relfilenode = c.confrelid
and a1.attrelid = t1.relfilenode
and a2.attrelid = t2.relfilenode
AND (
( c.conkey[1] = a1.attnum AND c.confkey[1] = a2.attnum ) OR
( c.conkey[2] = a1.attnum AND c.confkey[2] = a2.attnum ) OR
( c.conkey[3] = a1.attnum AND c.confkey[3] = a2.attnum ) OR
( c.conkey[4] = a1.attnum AND c.confkey[4] = a2.attnum ) OR
( c.conkey[5] = a1.attnum AND c.confkey[5] = a2.attnum ) OR
( c.conkey[6] = a1.attnum AND c.confkey[6] = a2.attnum ) OR
( c.conkey[7] = a1.attnum AND c.confkey[7] = a2.attnum ) OR
( c.conkey[8] = a1.attnum AND c.confkey[8] = a2.attnum ) OR
( c.conkey[9] = a1.attnum AND c.confkey[9] = a2.attnum ) OR
( c.conkey[10] = a1.attnum AND c.confkey[10] = a2.attnum )
)
order by 2
;
Emilio, he hecho un update a la tabla sin tener un error al hacerlo.
SET search_path to negocio;
ALTER TABLE sga_alumnos DISABLE TRIGGER ALL ;
/*INSERT INTO negocio.sga_alumnos(
persona, propuesta, plan_version, ubicacion, modalidad, calidad)
VALUES (11111111;, 12345555, 2343244,21212, 'S', 'Z');
*/
UPDATE negocio.sga_alumnos SET persona = 12345678 WHERE persona = 11111111;