Prevenir la duplicación en SQLite

Bilal Shahid 21 junio 2023
Prevenir la duplicación en SQLite

Al llenar una base de datos, uno de los problemas más comunes que uno puede encontrar es la duplicación de datos. Esto puede ser problemático para muchos usuarios, especialmente para aquellos con grandes bases de datos.

Podría tener una variedad de problemas, incluido el desperdicio de memoria, que puede ser bastante costoso.

Independientemente es necesario evitarlo idealmente durante la inserción. Esto evitará que los datos de acceso entren en la base de datos para empezar.

Cómo evitar entradas duplicadas en SQLite

En SQLite, hay varias formas de evitar entradas duplicadas. Las principales razones que diferencian cada uno de estos métodos son:

  1. La facilidad de aplicarlos.
  2. La tasa de efectividad.
  3. Los requisitos de su base de datos.

Eliminación manual

Antes de las consultas avanzadas de bases de datos, la norma era revisar las entradas e identificar cualquier duplicación. Esto aún puede funcionar para bases de datos con muy pocos registros.

Sin embargo, esto es ineficiente en todos los casos e inutilizable para bases de datos mucho más grandes. Estos problemas son la razón por la cual este método casi nunca se usa.

Usar consultas anidadas avanzadas

Las consultas anidadas avanzadas pueden hacer cualquier cosa si se aplican correctamente. Sin embargo, esto a menudo tampoco se aprecia.

Su diseño suele ser complejo y puede no ser preciso en todos los casos. Por lo tanto, aunque este método funciona, no se recomienda ya que existen métodos más simples.

la Restricción ÚNICA

Esta restricción a menudo se aplica en SQLite durante la creación de tablas. Cuando se aplica a una fila, evita que los usuarios ingresen entradas duplicadas en una base de datos en la misma fila.

Esta restricción también se aplica automáticamente cuando se utiliza una restricción de clave principal. Puede crear una tabla y aplicar la restricción única con el siguiente código.

CREATE TABLE users(
    users_id INTEGER,
    user_age INTEGER,
    UNIQUE(users_id, lessoninfo_id)
);

También puede aplicarlo directamente de la siguiente manera:

CREATE TABLE users(
   users_id INTEGER UNIQUE,
    user_age INTEGER
);

Si ya ha creado su tabla y necesita agregar una modificación para que cualquier fila sea única, deberá eliminar toda la tabla. También puede optar por un índice único, como se muestra en el código a continuación.

CREATE UNIQUE INDEX index_name
ON users(users_id);

la cláusula EXISTE

Exists se usa a menudo en consultas y consultas anidadas. Es fácil reducir consultas complejas a otras mucho más simplificadas.

La inversa es la cláusula NO EXISTE, que significa exactamente lo contrario. Esto se puede usar en consultas después de la inserción, como se muestra a continuación.

Primero, asegúrese de que su tabla ya esté creada. Puede usar el siguiente código para hacerlo.

CREATE TABLE users(
   users_id INTEGER,
    user_age INTEGER
);

Después de esto, comience a crear su consulta. Puede consultar el código a continuación para usar la cláusula correctamente.

SELECT *
FROM users
WHERE EXISTS
(
--any query with your preferred conditions
)

Nota: Aquí, si EXISTE fuera reemplazado por NO EXISTE, obtendría el resultado opuesto.

Como se explica a continuación, también puede aplicar esta lógica directamente durante la inserción usando la cláusula de manera diferente.

Insertar si NO EXISTE

Al crear una consulta que inserta valores en su tabla en una base de datos, el mejor y probablemente el método más utilizado es “insertar si no existe”.

Esto puede considerarse una mejor manera de usar la cláusula no existe combinándola con la consulta donde inserta datos. Un ejemplo de esto se muestra en el siguiente código.

Primero, crea tu tabla.

CREATE TABLE users(
   users_id INTEGER,
    user_age INTEGER
);

Luego, diseñe una consulta como la del código a continuación.

INSERT INTO users(users_id,user_age)
SELECT * /*user whose id isn't 1.*/
WHERE NOT EXISTS
(
SELECT 1 FROM memos WHERE id = 5 AND name= 'abc'
);

Como sugiere la etiqueta, esta consulta solo mostrará aquellos usuarios, o entradas de datos, donde el id del usuario no es 1. Siempre puede cambiar la condición modificando la consulta entre paréntesis según sus requisitos.

INSERTAR O IGNORAR

Otro método que evitaría con éxito que agregue cualquier redundancia en SQLite es la cláusula insertar o ignorar. Si la inserción viola cualquier término predefinido, la inserción será ignorada.

Su consulta se ejecutará con éxito, pero no se realizará ninguna inserción.

Tomemos otro ejemplo donde existe una clave principal. En una clave principal, existe la restricción única, lo que significa que no se aceptarán entradas duplicadas.

Primero se crea una tabla con una clave principal de la siguiente manera:

CREATE TABLE users
(
id INTEGER NOT NULL PRIMARY KEY,
age INTEGER
);

Podemos insertar un valor con la condición ignorar, como se muestra a continuación.

INSERT OR IGNORE
INTO users(id, age) VALUES(123, 24)

Si asumiéramos que ya existe un usuario con id 123, esta inserción no se produciría, y no habría cambios en la tabla original.

Nota: si no tiene una restricción única en la columna en la que está insertando los valores, el registro siempre se insertará.

la Cláusula REEMPLAZAR

En lugar de utilizar la cláusula ignorar, también puede optar por reemplazarla. Esto es similar a la cláusula ignorar, ya que primero verifica si los valores insertados son únicos si la restricción única (o clave principal) se ha aplicado a una determinada fila.

La diferencia aquí es que si el registro con la restricción única ya existe, lo reemplazará con el nuevo registro que está insertando.

INSERT OR REPLACE
INTO users(id, age) VALUES(123, abc)

Aquí, si ya existe un usuario con id 123 en la tabla, el nombre será reemplazado por abc.

Eso es todo lo que necesita saber para evitar entradas duplicadas en SQLite. Esperamos que ahora sepa exactamente qué hacer para satisfacer sus necesidades y producir la base de datos más eficiente.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - SQLite Insert