Estoy tratando con una tabla en SQL Server que tiene una columna serial_no
, que se define como una int no nula. No parece ser un campo de incremento automático, como si dejo esa columna fuera de mi declaración de inserción, recibo un error que dice que el campo serial_no
no puede ser nulo.SQL Server: inserte siguiente disponible int
Entonces, ¿cómo puedo insertar el siguiente número disponible?
yo probamos este:
INSERT INTO mytable (serial_no) VALUES ((SELECT MAX(serial_no)+1 FROM mytable))
pero me da un error que dice que subconsultas no se pueden utilizar en este contexto.
EDITAR: Esta tabla se utiliza en un producto listo para usar, por lo que no puedo cambiar el diseño y hacer que la columna serial_no aumente automáticamente.
¿Tiene que ser único en todas las filas? Los enfoques recomendados en las respuestas generalmente no son seguros para concurrencia, p. podrías terminar con duplicados ..... o necesitas a) hacer esto una columna 'INT IDENTITY' y dejar que SQL Server se preocupe por ello, b) hacer mucho más trabajo que los obviuos' SELECT MAX (serial_no) + 1', o c) esperar SQL Server 2011 y usar su concepto de 'SECUENCIAS' –
marc_s, estoy totalmente de acuerdo, pero desafortunadamente no puedo cambiar el diseño de la base de datos. ¿Qué pasa si bloqueo la mesa, hago la inserción y luego la desbloqueo? ¿Eso lo protegería de crear un engañado? ¿O una consulta que está en espera simplemente espera a que se libere el bloqueo y luego inserta un # duplicado de todos modos? –
¿Puede ejecutar un seguimiento para determinar cómo la aplicación de terceros crea el valor y simplemente hacer lo mismo? Diría que si no hay una columna de identidad, es probable que utilicen una tabla para contener el siguiente valor. Hay una respuesta que menciona esta técnica ya. –