Aunque han pasado los años de esta pregunta, me gustaría aclarar para los hispanohablantes, las pruebas se han realizado en Postgres:
La siguiente restricción se agregó a una tabla de 1337 registros, donde el kit es la clave principal:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Esto crea una clave primaria predeterminada NO DIFERIDA para la tabla, por lo que al intentar la próxima ACTUALIZACIÓN obtenemos un error:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
ERROR: la clave duplicada viola la restricción de unicidad «unique_div_nkit»
En Postgres, la ejecución de una ACTUALIZACIÓN para cada FILA verifica que se cumple la RESTRICCIÓN o RESTRICCIÓN.
El CONSTRAINT INMEDIATE ahora se crea y cada instrucción se ejecuta por separado:
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
Consulta OK, 0 filas afectadas (tiempo de ejecución: 0 ms; tiempo total: 0 ms) Consulta OK, 1328 filas afectadas (tiempo de ejecución: 858 ms; tiempo total: 858 ms) ERROR: llave duplicada viola restricción de unicidad «unique_div_nkit» DETALLE : Ya existe la llave (div_nkit) = (1338).
Aquí SI permite cambiar la clave primaria ya que ejecuta la primera oración completa completa (1328 filas); pero aunque está en la transacción (BEGIN), la CONSTRAINT se valida inmediatamente después de terminar cada oración sin haber hecho COMMIT, por lo tanto genera el error al ejecutar el INSERT. Finalmente creamos la CONSTRAINT DEFERRED para hacer lo siguiente:
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
Si ejecutamos cada declaración del ** Bloque 2 **, cada oración por separado, no se genera ningún error en el INSERT ya que no se valida, pero el COMITÉ final se ejecuta donde encuentra una inconsistencia.
Para obtener información completa en inglés, le sugiero que consulte los enlaces:
Restricciones de SQL diferibles en profundidad
NO DEFERRABLE versus DEFERRABLE INICIALMENTE INMEDIATO