Editar: Cuando digo "SQL Server", realmente estoy hablando de Management Studio. Lo siento si eso fue confuso.SSMS permite registros duplicados en una tabla, pero no actualizaciones posteriores
Oh Odio cuando pasan cosas como esta. Ayer estaba trabajando con SQL Server y probando el comando PIVOT para intentar descubrir cómo funcionaba. Así que creé una nueva tabla con cuatro columnas, y la primera columna iba a tener el mismo valor para las primeras filas.
Agregué el "valor1" a la primera fila, primera columna, y presioné enter - sine no se agregaron claves o restricciones aún, me permitió ingresar a la siguiente fila con NULLs para las otras columnas en el primer fila (lo cual está bien). Para mi sorpresa, también me permitió ingresar "value1" en la segunda fila e ingresar down - esto debería ser imposible ya que ahora hay dos filas idénticas. Sin embargo, como solo estaba jugando, esto no me molestó. Así procedo a crear cuatro filas como tal:
Tabla 1
Col1 Col2 Col3 Col4
---------------------------------
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Value1 NULL NULL NULL
Obviamente esto es extraño y se rompe la teoría relacional, pero no me importó, ya que esto es sólo una tabla que he creado para perder el tiempo con. Sin embargo, casi me quité el pelo por lo que sucedió a continuación. Después de tener estos datos, no pude hacer nada en la tabla. Si traté de rellenar col2, col3 o col4 en cualquiera de las filas, SQL Server me gritaba por tener filas duplicadas: "No se actualizó ninguna fila. Los datos en la fila 1 no se confirmaron ... El valor de la fila (s) actualizadas o eliminadas, ya sea que no hagan que la fila sea única o alteran varias filas (4 filas) ".
En otras palabras, SQL Server me permitió ingresar en filas duplicadas, pero cuando traté de actualizar las filas para hacerlas únicas, no me lo permitió, citando que hay filas duplicadas como su razón. La peor parte es que ni siquiera podía eliminar ninguna fila (recibo el mismo mensaje de error). La única solución que encontré una vez en este escenario fue eliminar la tabla y comenzar de nuevo, lo cual es ridículo.
Mi pregunta es, ¿cómo puede existir este tipo de comportamiento en un programa bien conocido que ha evolucionado durante más de una década? ¿Soy yo el que no tiene cerebro y debería aceptar el comportamiento de SQL Server? Para mí esto es inaceptable y SQL Server nunca debería haberme permitido ingresar filas duplicadas, o debería haberme permitido actualizar las filas duplicadas hasta que fueran únicas y luego intentar guardarlas.
Esto de ninguna manera pretende ser algún tipo de publicación de odio de SQL Server. Es relativamente raro que me encuentre con un comportamiento como este, pero cuando lo hago, realmente me puede retrasar y volverme loco. Simplemente no entiendo por qué el programa tiene un comportamiento incorporado así. ¿Por qué en el mundo me permitió ingresar las filas duplicadas en primer lugar si no planeaba dejarme arreglarlo?
Recuerdo haber trabajado con MS Access durante el día y me encontraba con el mismo tipo de comportamiento extraño y arcaico. Algunas veces tuve que copiar enormes cantidades de datos, volver a crear la tabla y volver a copiarla solo porque Access me había permitido hacer algo que no debería tener, y ahora me está bloqueando cualquier cambio para solucionarlo. - produciendo efectivamente un punto muerto.
¿Qué está pasando aquí? ¿Necesito algún tipo de cambio de paradigma cuando me acerco a SQL Server? ¿Soy yo o SQL Server el problema? (Puede decir que soy yo, puedo aceptarlo)
Gracias por explicar las razones detrás de permitir las inserciones pero no permitir las actualizaciones/eliminaciones. Esto fue muy útil. – JoeCool
Ah, entiendo el mensaje de error mucho mejor ahora. Al principio pensé que el error era una realización latente de las filas duplicadas, como que SSMS era una especie de "despertar" y ver que si borraba una fila, habría tres duplicados todavía allí, y no podría permitir duplicados. Pero no, fue incapaz de eliminar la fila porque no sabía cuál de las cuatro eliminar. – JoeCool