Em primeiro lugar, está faltando um parêntese, que você não precisa usar neste caso
Altere sua string de consulta para
Insert Into archived (select * from registrations WHERE id=$id)
^ ^
ou apenas
Insert Into archived select * from registrations WHERE id=$id
Aqui está SQLFiddle demonstração
Em segundo lugar
INSERT
não retorna um conjunto de resultados, então você não deve usar mysql_fetch_array()
. Em terceiro lugar, se sua intenção era mover não apenas para copiar dados, você também precisa excluir a linha que você copiou posteriormente.
Agora você pode colocar tudo em um procedimento armazenado
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 ;
Exemplo de uso:
CALL move_to_archive(2);
Aqui está SQLFiddle demonstração