¿Puedo activar ignorar clave dup para una clave primaria?


Tengo una clave primaria de dos columnas en una tabla. He intentado modificarlo para activar ignore_dup_key con este comando:

ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);

Pero obtengo este error:

Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.

¿De qué otra manera debería poner IGNORE_DUP_KEY en on?

Author: gotqn, 2010-04-07

5 answers

No está documentado en los Libros en línea, pero he encontrado que si bien esto es válido para las Claves Primarias, no se puede cambiar esto con un ALTER INDEX, tendrá que soltar y volver a crear la clave primaria.

Tenga en cuenta que esta bandera no le permite almacenar realmente filas duplicadas, simplemente cambia el error que resulta:

ON
A warning message will occur when duplicate key values are inserted into a unique
index. Only the rows violating the uniqueness constraint will fail.

OFF
An error message will occur when duplicate key values are inserted into a 
unique index. The entire INSERT operation will be rolled back.

De http://msdn.microsoft.com/en-us/library/ms175132.aspx

 22
Author: BradC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 16:45:05
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
 51
Author: Kvasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-11 14:39:12

Determina lo que sucede cuando se insertan solo duplicados

Ver CAMBIAR LA TABLA..opción de índice

Especifica la respuesta de error cuando la operación insertar intenta insertar duplicar valores de clave en un único Indice. La opción IGNORE_DUP_KEY se aplica solo a las operaciones de inserción después de crear o reconstruir el índice. La opción no tiene efecto cuando ejecutando CREATE INDEX, ALTER INDEX, o ACTUALIZAR.

..y no se aplica a PKs

El comentario BOL para ALTER TABLE sobre esto y la "compatibilidad hacia atrás" es algo confuso. Acabo de intentarlo y Brdc está en lo cierto.

CREATE TABLE dbo.foo (bar int PRIMARY KEY WITH (FILLFACTOR=90, IGNORE_DUP_KEY = ON))
GO
INSERT dbo.foo VALUES (1)
GO
INSERT dbo.foo VALUES (1)
GO
--gives    
(1 row(s) affected)

Duplicate key was ignored.

(0 row(s) affected)
 4
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 16:52:07

Tenga en cuenta que esta configuración solo afecta lo que sucede si intenta insertar una clave duplicada, no le permitirá insertar una clave duplicada.

Si está intentando insertar claves duplicadas, puede eliminar el índice de clave primaria, insertar sus registros, arreglar los datos (eliminar duplicados, etc.).), luego vuelva a crear el índice.

 0
Author: Marcus Adams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 17:35:18

Personalmente nunca quiero que ignore el duplicado. Si hay un valor duplicado en una clave primaria, debe corregirse. No quiero que se ignore y los otros registros insertados porque entonces el usuario podría pensar que todos se insertaron. Esta configuración es un encubrimiento de un mal proceso de inserción. Un proceso bien diseñado no necesita esta configuración, ya que limpia los datos antes de ingresarlos (o usa upsert para actualizar los existentes e insertar nuevos) y envía los registros defectuosos a una tabla para que se puede arreglar y reinsertarse o envía un error al usuario, para que sepa que su registro no se insertó.

 -1
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 17:01:23