2010-01-21 3 views
0

У меня есть простая вставка выбрать и вставить _TABLE_B_ данных в _TABLE_A_ новой строкиКак вставить команду insert в mysql?

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

Я хочу, чтобы вставить строку в таблице с именем _TABLE_C_ каждый раз, когда я вставить строку в _TABLE_A _ и добавьте текущий вставленный _TABLE_C_ id в _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, заявление, как у меня, потому что вставка выберите цикл может и у меня есть к петле.

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

ответ

0

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

  1. создать временную таблицу и добавить динамический оператор выбора, который восстановить первичные ключи (ID)
  2. объявить курсор и выбрать этот временный идентификатор таблицы (переменные не работает, но временные таблицы делают)
  3. выполнить заявление, чтобы создать временную таблицу
  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 
1

Я бы сделал все ВСТАВКИ в _TABLE_C_, а затем присоединил его к INSERT _TABLE_A_, чтобы получить соответствующие внешние ключи.

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

Cursor on _TABLE_B_ & Fetch 

INSERT _TABLE_C_ 

INSERT _TABLE_A_ with Foreign_Id = SCOPE_IDENTITY() 

Fetch next 
+0

нормально независимо от того, работает ли он, покажите мне, D помню, что я должен делать вставки в то же время, чтобы избежать испорченных данных – belaz

+0

Каковы ваши столбцы в _TABLE_C? –

+0

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

Смежные вопросы