From what I can gather, the following should suffice, so long as the fields are what you have provided.
INSERT INTO Address (email) SELECT User.email FROM User JOIN person ON User.id_person = person.id WHERE person.id_address IS NULL ;
EDIT (with Cursor)
This should be pretty simple with a cursor, however I highly advise you familiarize yourself with these and the implications.
DROP PROCEDURE IF EXISTS _tmp_update_address; DELIMITER $$ CREATE PROCEDURE _tmp_update_address() BEGIN DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE; DECLARE cur_userId, cur_personId INT; DECLARE cur_email VARCHAR(250) DEFAULT ''; DECLARE cursor_List CURSOR FOR SELECT User.id, person.id_address, User.email FROM User JOIN person ON User.id_person = person.id WHERE person.id_address IS NULL ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE; OPEN cursor_List; loop_List: LOOP FETCH cursor_List INTO cur_userId, cur_personId, cur_email; IF cursor_List_isdone THEN LEAVE loop_List; END IF; INSERT INTO Address (email) VALUES (cur_email); UPDATE person SET person.id_address = LAST_INSERT_ID() WHERE person.id = cur_personId; END LOOP loop_List; CLOSE cursor_List; END $$