verificar validar saber registro inserto existe este ejecutar datos como antes sql optimization query-optimization

sql - saber - validar si un registro existe en la base de datos



Sql: cómo verificar correctamente si existe un registro (7)

Es mejor usar un

select 1 from table where key = value; select count(1) from table where key = value;

La primera alternativa no debería dar ningún resultado o un resultado, el segundo conteo debe ser cero o uno.

¿Qué edad tiene la documentación que está usando? Aunque haya leído buenos consejos, la mayoría de los optimizadores de consultas en los RDBMS recientes optimizan el select count(*) todos modos, de modo que si bien existe una diferencia en teoría (y bases de datos anteriores), no debería notar ninguna diferencia en la práctica.

Al leer algunos documentos de SQL Tuning encontré esto:

Select count(*) :
- Cuenta el número de filas
- A menudo se usa incorrectamente para verificar la existencia de un registro

¿Es Select count(*) realmente tan malo?

¿Cuál es la forma correcta de verificar la existencia de un registro?


Las otras respuestas son bastante buenas, pero también sería útil agregar LIMIT 1 (o el equivalente) para evitar la verificación de filas innecesarias.


Preferiría no utilizar la función de recuento en absoluto:

IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... ) <do smth>

Por ejemplo, si desea verificar si el usuario existe antes de insertarlo en la base de datos, la consulta puede verse así:

IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = ''John'' AND LastName = ''Smith'' ) BEGIN INSERT INTO Users (FirstName, LastName) VALUES (''John'', ''Smith'') END


Puedes usar:

SELECT 1 FROM MyTable WHERE <MyCondition>

Si no hay ningún registro que coincida con la condición, el conjunto de registros resultante está vacío.


Puedes usar:

SELECT 1 FROM MyTable WHERE... LIMIT 1

Use select 1 para evitar la verificación de campos innecesarios.

Use el LIMIT 1 para evitar la verificación de filas innecesarias.


Puedes usar:

SELECT COUNT(1) FROM MyTable WHERE ...

o

WHERE [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )

Esto será más eficiente que SELECT * ya que simplemente selecciona el valor 1 para cada fila, en lugar de todos los campos.

También hay una diferencia sutil entre COUNT (*) y COUNT (nombre de columna):

  • COUNT(*) contará todas las filas, incluidos los nulos
  • COUNT(column name) solo contará las apariciones no nulas del nombre de la columna

SELECT COUNT(1) FROM MyTable WHERE ...

recorrerá todos los registros. Esta es la razón por la que es malo usarlo para registrar la existencia.

yo usaría

SELECT TOP 1 * FROM MyTable WHERE ...

Después de encontrar 1 registro, terminará el ciclo.