Как мне вставить в команду вставки с MySQL? - PullRequest
0 голосов
/ 21 января 2010

У меня есть простой выбор вставки, который вставляет _TABLE_B_ данные в _TABLE_A_ новая строка

INSERT INTO _TABLE_A_(_USERNAME_,_ID_) 
SELECT  _USERNAME_,_ID_ 
FROM _TABLE_B_ 

Я хочу вставить строку в таблицу с именем _TABLE_C_ каждый раз, когда я вставляю строку в _TABLE_A _ и добавляю текущий вставленный _TABLE_C_ идентификатор в _TABLE_A_ .

Я попытаюсь объяснить это по-другому:

INSERT INTO _TABLE_A_(_USERNAME_,_ID_,_FOREIGN_ID_) 
SELECT  B._USERNAME_,B._ID_,C._FOREIGN_ID_
FROM _TABLE_B_ AS B 
LEFT JOIN _TABLE_C_ AS C
#Insert a row in _TABLE_C_ to retrieve _FOREIGN_ID_...

Я ищу один минимальный запрос с оператором INSERT SELECT , как у меня, потому что insert select может зацикливаться, а мне нужно зацикливаться.

К вашему сведению: Я в хранимой процедуре. Я также использую подготовленные операторы с динамическими данными, а курсоры не подходят для динамического выбора данных ...

Ответы [ 2 ]

1 голос
/ 21 января 2010

Сначала я сделаю все INSERT в _TABLE_C_, а затем присоединюсь к INSERT _TABLE_A_, чтобы получить соответствующие внешние ключи.

Если это невозможно, я бы использовал курсор.

Cursor on _TABLE_B_ & Fetch

INSERT _TABLE_C_

INSERT _TABLE_A_ with Foreign_Id = SCOPE_IDENTITY()

Fetch next
0 голосов
/ 21 января 2010

Я нашел решение.

  1. создать временную таблицу и добавить динамический оператор выбора, который извлекает первичные ключи (id)
  2. объявить курсор и выбрать этот временный идентификатор таблицы (переменные не работают, но временные таблицы работают)
  3. оператор execute для создания временной таблицы
  4. открыть курсор и повторить вставки

Пример


  BEGIN


    DECLARE isDone INT DEFAULT 0;
    DECLARE fetchedmemberWhoWillReceiveMailId int;

    DECLARE cur1 CURSOR FOR SELECT id FROM memberWhoWillReceiveMail;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET isDone = 1;
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    SET @sexe     = VAR_sexe; 
    SET @event    = VAR_eventId;
    SET @subject = VAR_subject;
    SET @body     = VAR_body; 
    SET @to        = VAR_to; 
    SET @from  = VAR_from;
    SET @region    = VAR_region;
    SET @departement      = VAR_departement; 
    SET @age        = VAR_age;

    SET @baseSqlStatement =' CREATE TEMPORARY TABLE memberWhoWillReceiveMail SELECT e.id FROM TABLE_A as e LEFT JOIN TABLE_B AS a on a.member_id = e.id';

    SET @whereSqlStatement= 'WHERE e.is_visible = 1 AND e.member_group_id IN (10,11) ';

    IF (@region!='') THEN  
    SET @whereSqlStatement=  CONCAT(@whereSqlStatement,' AND region=',@region);
    END IF;

    IF (@event !=null ) THEN 
    SET @whereSqlStatement=  CONCAT(@whereSqlStatement,' AND m.event_id !=' ,@eventId); 
    END IF;

    IF (@sexe!=null ) THEN
    SET @whereSqlStatement=  CONCAT(@whereSqlStatement,' AND e.sexe=',@sexe); 
    END IF;

    SET @baseSqlStatement = CONCAT(@baseSqlStatement,@whereSqlStatement);

    START TRANSACTION;
    PREPARE stmt1 FROM @baseSqlStatement;
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1;

    OPEN cur1; 
    FETCH cur1 INTO fetchedmemberWhoWillReceiveMailId; 
    WHILE NOT isDone DO
        INSERT INTO conversation(created_at,updated_at)VALUES(now(),now());
        INSERT INTO message(created_at,updated_at,from, to, uniqueID)   VALUES(now(),now(),@from,fetchedmemberWhoWillReceiveMailId,LAST_INSERT_ID() );
        FETCH cur1 INTO fetchedmemberWhoWillReceiveMailId; END WHILE; CLOSE cur1;

    COMMIT;
    DROP TEMPORARY TABLE IF EXISTS memberWhoWillReceiveMail;

    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...