En primer lugar, te falta un paréntesis, que no tienes que usar en este caso
Cambie su cadena de consulta a
Insert Into archived (select * from registrations WHERE id=$id)
^ ^
o simplemente
Insert Into archived select * from registrations WHERE id=$id
Aquí está SQLFiddle demostración
En segundo lugar INSERT
no devuelve un conjunto de resultados, por lo que no debe usar mysql_fetch_array()
.
En tercer lugar, si su intención era mover no solo para copiar datos, sino que también debe eliminar la fila que copió después.
Ahora puede ponerlo todo en un procedimiento almacenado
DELIMITER $$
CREATE PROCEDURE move_to_archive(IN _id INT)
BEGIN
START TRANSACTION;
INSERT INTO archived
SELECT *
FROM registrations
WHERE id = _id;
DELETE
FROM registrations
WHERE id = _id;
COMMIT;
END$$
DELIMITER ;
Ejemplo de uso:
CALL move_to_archive(2);
Aquí está SQLFiddle demostración