persona duplicada

Hola

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?

Emilio

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.

Saludos.

Hola

Mi duda, ahora que reviso bien el código que posteas, es saber porque la tabla personas no tenía pk.

como hago para listar todas las tablas que tienen una fk contra el campo personas?

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
	;

Saludos.

Ok. Gracias

y como hago para diferir todas las fk?

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
	;

eso deshabilita triggers no fk.

Lo busque en internet y funciona.
Lo he probado así



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');

Esos datos no existen en mi base y sin embargo hace bien el insert.

intentá un update o delete

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;