A nivel de BBDD hay más de una forma de hacerlo:
1) Si los datos posibles para agregar llevan el dto usado como PK, simplemente haces un
Código SQL:
Ver originalINSERT IGNORE INTO tablaMaestra(campos)
SELECT valores
FROM tablaHija;
El IGNORE hace que se ingresen todos los registros cuyo valor de PK no existan ya en la tabla destino (la maestra), sin disparar un error de clave duplicada. Las duplicidades simplemente no se insertan.
2) Si la tabla origen (hija) no tiene el campo pk, pero sí otros valores que no se deben duplicar, lo que haces es procesarlo en dos consultas seguidas dentro de la misma conexión (esto es importante) y sin cerrarla. Es decir: Son dos sentencias SQL consecutirvas sin cerrar conexion a MySQL:
Código SQL:
Ver originalCREATE TEMPORARY TABLE tablatemp
AS
SELECT T2.*
FROM tablaHija
WHERE (campo1, campo2, ...) NOT IN (SELECT campo1, campo2, ... FROM TablaMaestra);
Código SQL:
Ver originalINSERT INTO tablaMaestra(Campo1, campo2, ...)
SELECT *
FROM tablatemp;
"(campo1, campo2, ...)" representa el conjunto de campos (uno o más de uno) que contienen en la tabla origen los valores que pueden ya existir en la tabla maestra. Al ponerlos entre paréntesis haces que MySQL los compare como conjunto único contra cada registro devuelto por la subconsulta (que debe tener la misma cantidad de campos y en el mismo orden).
El CREATE TEMPORARY TABLE crea una tabla temporal que desaparece cuando se cierre la conexión (por eso se debe hacer sobre la misma) y almacenaría los registros de la tabla origen que NO existan en la Maestra.
Luego de eso es un simple INSERT, donde debes indicar los campos a ingresar uno a uno y en el mismo orden de la tabla temporal creada.
¿Se entiende?
La solución dependerá de lo que quieras hacer y lo que tengas, pero no nos estas dando datos como para confirmar cuál te conviene.
Nota: Obviamente esta solucion sólo palica a BBDD, no PHP. Para PHP es irrelevante mas alla de la llamada a ejecutar las queries.