Pregunta

Tengo tabla, que estoy insertando registros en otra tabla. ¿Cuál es la mejor manera de marcar el registro insertado, para que no se intente volver a insertarlo?

¿Fue útil?

Solución

Puedes ver la diferencia entre las dos tablas así:

  

SELECCIONAR * DE tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    DONDE tableBar.commonColumn es nulo

La idea es que ambas tablas tengan una columna con la que coincidir, y los registros que se unen cuando la columna es nula son los registros que solo están presentes en tableBar.

La razón por la que esto funciona es porque las combinaciones a la izquierda devolverán los registros incluso si una de las tablas tiene valores nulos, a diferencia de una combinación interna, que hace lo contrario.

Después de obtener esos registros, puede insertarlos según los ID devueltos.

Otros consejos

inserte solo los registros que no estén en su otra tabla, ya sea usando una cláusula NOT EXISTS o al unir a la izquierda y filtrando todos los registros not-NULL del resultado

La mejor manera es usar una clave común (o hacer que la clave de la primera tabla sea la parte principal de la clave de la segunda tabla). De esa manera, simplemente selecciona las filas de la TABLA1 donde NO EXISTE en la tabla 2.

La mejor alternativa, si necesita transformar la clave de alguna manera, es usar un disparador de inserción en la TABLA1: cuando inserte filas allí, el disparador se disparará, y puede insertar datos en la TABLA2. Esto tiene la ventaja, y también el inconveniente, de utilizar una sola transacción. Es un beneficio porque conserva la coherencia de los datos, un inconveniente si se utiliza TABLE2 para informes u otros fines no esenciales.

NO decida utilizar un indicador en la TABLA 1 que indica que se ha insertado la fila. Esto es feo, tanto por su diseño lógico como físico, porque está acoplando datos en la tabla a un proceso que usa la tabla.

Hay dos métodos que uso con frecuencia. Dependiendo de la naturaleza de la tabla, una forma puede ser mejor que otra, sin embargo, si elige el número 2, es probable que haya oportunidades para mejorar la estructura de la tabla.

1.) Asegúrese de que sus tablas estén indexadas y tenga una buena clave principal. Seleccione todos los registros de la tabla 1 donde la clave principal no existe en la tabla 2. Esto funciona para tablas normalizadas

2.) Si sus tablas no están normalizadas y no tienen buenas claves buenas, puede agregar una Fecha de proceso a la tabla1. Inserte todos los registros que tengan un ProcessDate nulo y luego establezca ProcessDate en la fecha y hora actual. Solo deberá asegurarse de que no se hayan insertado nuevos registros en la tabla 1 durante el tiempo que estuvo insertando en la tabla2.

Sin conocer la estructura de su tabla, es difícil dar una buena respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top