database - tipos - modificar valores de una tabla sql
SQL cómo aumentar o disminuir uno para una columna int en un comando (6)
Tengo una tabla de Pedidos que tiene una columna Cantidad. Durante el check-in o check-out, necesitamos actualizar esa columna Cantidad en uno. ¿Hay alguna manera de hacer esto en una acción o tenemos que obtener el valor existente y luego agregar o restar uno encima de él?
Otra pregunta es cuando insertamos una nueva fila, ¿necesitamos verificar si existen los mismos datos y luego insertar si no, que son dos pasos, o hay una mejor manera de hacerlo?
Gracias,
@dotjoe Es más barato actualizar y verificar @@ rowcount, luego hacer un inserto.
Las excepciones son costosas y las actualizaciones son más frecuentes
Sugerencia: si desea obtener el máximo rendimiento en su DAL, haga que la interfaz pase una identificación única para la fila que se actualizará, si nulo insertado.
Los DAL deben ser CRUD, y no deben preocuparse por ser apátridas.
Si lo hace sin estado, con buenos índices, no verá una diferencia con la siguiente instrucción SQL vs 1. IF (seleccione top 1 * forma x donde PK = @ ID) Insert else update
La respuesta de un solo paso a la primera pregunta es usar algo como:
update TBL set CLM = CLM + 1 where key = ''KEY''
Esa es una forma de hacerlo de una sola instrucción.
En cuanto a la segunda pregunta, no debería necesitar recurrir a gimnasia SQL específica de DBMS (como UPSERT
) para obtener el resultado que desea. Hay un método estándar para actualizar o insertar que no requiere un DBMS específico.
try:
insert into TBL (key,val) values (''xyz'',0)
catch:
do nothing
update TBL set val = val + 1 where key = ''xyz''
Es decir, intenta hacer la creación primero. Si ya está allí, ignore el error. De lo contrario, lo crea con un valor de 0.
Luego haga la actualización que funcionará correctamente si o no:
- la fila originalmente existió
- alguien lo actualizó entre su inserción y actualización.
No es una instrucción única y, sin embargo, sorprendentemente, es la forma en que lo hemos estado haciendo con éxito durante mucho tiempo.
Si mi comprensión es correcta, las actualizaciones deberían ser bastante simples. Solo haría lo siguiente.
UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0
Es posible que necesite filtros adicionales para actualizar solo una fila en lugar de todas las filas.
Para las inserciones, puede almacenar en caché localmente alguna identificación única relacionada con su registro y verificar contra esta caché y decidir si insertarla o no. El enfoque alternativo es siempre insertar y verificar el error de violación de PK e ignorar ya que es una inserción redundante.
para responder el segundo:
haga que la columna sea única y capture la excepción si está configurada con el mismo valor.
Para responder el primero:
UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
Para responder el segundo:
Hay varias formas de hacer esto. Como no especificó una base de datos, asumiré MySQL.
-
INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
-
REPLACE INTO table SET x=1, y=2
Ambos pueden manejar su pregunta. Sin embargo, la primera sintaxis permite una mayor flexibilidad para actualizar el registro en lugar de simplemente reemplazarlo (como lo hace el segundo).
Tenga en cuenta que para que ambos existan, tiene que haber una clave ÚNICA definida ...
UPDATE Orders Order
SET Order.Quantity = Order.Quantity - 1
WHERE SomeCondition(Order)
Hasta donde sé, no hay soporte incorporado para INSERT-OR-UPDATE en SQL. Sugiero crear un procedimiento almacenado o usar una consulta condicional para lograr esto. Here puede encontrar una colección de soluciones para diferentes bases de datos.