簡體   English   中英

如何使用mysql插入命令?

[英]How do i insert in an insert command with mysql?

我有一個簡單的插入選擇, 它將_TABLE_B_數據插入_TABLE_A_新行

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

我想插入一個名為每次我在_TABLE_A插入一行_TABLE_C_ _表中的一行,並在_TABLE_A_添加當前插入_TABLE_C_ ID。

我將嘗試以其他方式進行解釋:

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可以循環,而我必須循環。

僅供參考:我處於存儲過程中。 我也將准備好的語句與動態數據一起使用,並且游標不適合動態數據選擇...

我將首先在_TABLE_C_中進行所有INSERT,然后將其加入INSERT _TABLE_A_中以獲取適當的外鍵。

如果那是不可能的,我將使用光標。

Cursor on _TABLE_B_ & Fetch

INSERT _TABLE_C_

INSERT _TABLE_A_ with Foreign_Id = SCOPE_IDENTITY()

Fetch next

我找到了解決方案。

  1. 創建一個臨時表並添加動態選擇語句以檢索主鍵(id)
  2. 聲明一個游標並選擇此臨時表ID(變量不起作用,但臨時表起作用)
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM