SQL cómo aumentar o disminuir uno para una columna int en un comando


119

Tengo una tabla de pedidos que tiene una columna de cantidad. Durante el check in o el check out, necesitamos actualizar esa columna de Cantidad en una. ¿Hay alguna manera de hacer esto en una acción o tenemos que obtener el valor existente y luego agregar o menos uno encima?

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 hacer esto?

Gracias,

Respuestas:


250

Para responder a la primera:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

Para responder al segundo:

Hay varias formas de hacer esto. Como no especificó una base de datos, asumiré MySQL.

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

Ambos pueden manejar su pregunta. Sin embargo, la primera sintaxis permite más flexibilidad para actualizar el registro en lugar de simplemente reemplazarlo (como lo hace la segunda).

Tenga en cuenta que para que ambos existan, tiene que haber una clave ÚNICA definida ...


32
Como no especificó una base de datos, realmente debería asumir SQL estándar.
paxdiablo

12

La respuesta de un solo paso a la primera pregunta es usar algo como:

update TBL set CLM = CLM + 1 where key = 'KEY'

Es una forma de hacerlo con 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. Existe 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, intentas hacer la creación primero. Si ya está allí, ignore el error. De lo contrario, lo crea con un valor 0.

Luego haga la actualización que funcionará correctamente si o no:

  • la fila existía originalmente.
  • alguien lo actualizó entre su inserción y actualización.

No es una sola instrucción y, sin embargo, sorprendentemente, así es como lo hemos estado haciendo con éxito durante mucho tiempo.


4

Si mi entendimiento es correcto, 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 una sola fila en lugar de todas las filas.

Para las inserciones, puede almacenar en caché alguna identificación única relacionada con su registro localmente y compararla con esta caché y decidir si insertar o no. El enfoque alternativo es siempre insertar y verificar el error de violación de PK e ignorarlo, ya que se trata de una inserción redundante.


4
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

Hasta donde yo sé, no hay soporte integrado para INSERT-OR-UPDATE en SQL. Sugiero crear un procedimiento almacenado o usar una consulta condicional para lograr esto. Aquí puede encontrar una colección de soluciones para diferentes bases de datos.


Es posible que obtenga un error de sintaxis al lanzar la palabra reservada ORDER así ...
gahooa

0

para responder al segundo:

haga que la columna sea única y capture la excepción si se establece en el mismo valor.


0

@dotjoe Es más barato actualizar y verificar @@ rowcount, hacer una inserción después del hecho.

Las excepciones son caras && las actualizaciones son más frecuentes

Sugerencia: si desea tener un rendimiento superior en su DAL, haga que el front-end pase en una ID única para que la fila se actualice, si es nula, inserte.

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 declaración SQL vs 1. SI (seleccione la parte superior 1 * formulario x donde PK = @ ID) Inserte otra actualización

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.