insertar o ignorar filas que violan restricciones de clave extranjeras sqlite

Estoy tratando de insertar muchas filas en mi mesa, algunas de las cuales violan una restricción de llave extranjera en esa tabla. Quiero SKIP añadir las filas que violan esta restricción y añadir todas las filas correctas con éxito. Sin embargo, tengo un error incluso si uso insert or ignore en mi consulta.

¿Hay alguna manera de hacer esto en SQLite?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por techmaestro


3 Respuestas:

  • Puedes usar not exists para filtrar en el insert declaración:

    insert into table2 ( . . . )
        select . . . 
        from table1 t1
        where exists (select 1
                      from table2 t2
                      where t2.pk = t1.t2pk
                     );
    

    Eso es, ni siquiera intentes la inserción.

    Respondida el Dec 17, 2020 a las 07:40 - por binaryblossom

    Votos positivos: 0 | Votos negativos: 0

  • En SQLite, al intentar insertar datos en una tabla que violan una restricción de clave externa, puedes utilizar la cláusula INSERT OR IGNORE para evitar que se inserten las filas que causarían esa violación. Sin embargo, debes tener en cuenta que INSERT OR IGNORE solo evita que se produzca un error al intentar insertar filas que violen la restricción, pero no informará si se omitieron algunas filas.

    Aquí tienes un ejemplo de cómo podrías utilizar INSERT OR IGNORE en SQLite:

    sql
    INSERT OR IGNORE INTO tabla_destino (columna1, columna2) 
    SELECT columna1, columna2 
    FROM tabla_origen
    

    En el ejemplo anterior, estamos intentando insertar filas de la tablaorigen en la tabla tabladestino. Si alguna de las filas de la tablaorigen viola una restricción de clave externa en la tabladestino, esa fila será ignorada y las filas válidas se insertarán correctamente.

    Recuerda también que es importante garantizar la integridad de los datos al utilizar esta técnica, ya que las filas que se omiten no se insertarán y es posible que debas verificar si alguna información importante se está perdiendo.

    Respondida el Dec 18, 2020 a las 07:41 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, puedes usar la cláusula ON CONFLICT para manejar las violaciones de restricciones de clave externa en SQLite. Esta cláusula te permite especificar qué acción tomar cuando se produce un conflicto de inserción.

    Para insertar o ignorar filas que violan restricciones de clave externa, puedes usar la siguiente sintaxis:

    sql
    INSERT OR IGNORE INTO  () VALUES ()
    ON CONFLICT() DO 
    

    Donde:

    <tabla> es el nombre de la tabla en la que deseas insertar los datos. <columnas> son las columnas en las que deseas insertar datos. <valores> son los valores que deseas insertar en las columnas. <columnas_conflicto> son las columnas en las que se produce el conflicto de clave externa.

    • `` es la acción que deseas realizar cuando se produce un conflicto. Para ignorar la fila, puedes usar la acción `IGNORE`.

    Por ejemplo, si tienes una tabla llamada pedidos con una columna id_cliente que es una clave externa para la tabla clientes, puedes utilizar la siguiente consulta para insertar o ignorar filas que violan la restricción de clave externa:

    sql
    INSERT OR IGNORE INTO pedidos (id_pedido, id_cliente, fecha)
    VALUES (1, 100, '2023-03-08')
    ON CONFLICT(id_cliente) DO IGNORE;
    

    Esta consulta insertará la fila en la tabla pedidos si el cliente con id_cliente 100 existe en la tabla clientes. Si el cliente no existe, la fila se ignorará y no se insertará.

    Ten en cuenta que la cláusula ON CONFLICT solo se aplica a las filas que violan las restricciones de clave externa especificadas en la cláusula ON CONFLICT. Si una fila viola otras restricciones, como restricciones NOT NULL o restricciones UNIQUE, la fila no se insertará y se producirá un error.

    Respondida el Dec 18, 2020 a las 07:51 - por Gemini

    Votos positivos: 0 | Votos negativos: 0