[mysql] 테이블의 모든 행을 어떻게 반복 할 수 있습니까? (MySQL)

테이블 A가 있고 하나의 기본 키 ID가 있습니다.

이제 A의 모든 행을 살펴 보겠습니다.

‘A의 각 레코드마다’와 같은 것을 찾았지만 이것은 MySQL에서 수행하는 방식이 아닌 것 같습니다.

필드를 가져 와서 변환하고 다른 테이블에 삽입 한 다음 행의 일부 필드를 업데이트하려는 각 행에 대한 것입니다. 선택 부분과 삽입을 하나의 문에 넣을 수 있지만 거기에 업데이트를 얻는 방법도 모르겠습니다. 그래서 반복하고 싶습니다. 그리고 연습을 위해 MySQL 이외의 다른 것을 사용하고 싶지 않습니다.

편집하다

예를 들어 감사하겠습니다.

그리고 절차에 넣을 필요가없는 솔루션.

편집 2

이 시나리오를 생각해보십시오.

각각 필드 ID 및 VAL이있는 테이블 A 및 B.

이제 이것은 내가 원하는 일에 대한 의사 코드입니다.

for(each row in A as rowA)
{
  insert into B(ID, VAL) values(rowA[ID], rowA[VAL]);
}

기본적으로 루프를 사용하여 A의 내용을 B로 복사합니다.

(이것은 단순한 예제 일뿐입니다. 물론 루프를 사용하지 않을 것입니다.)}



답변

루프의 제안은 프로 시저 유형 솔루션에 대한 요청을 의미하기 때문에. 여기 내 꺼야.

테이블에서 가져온 단일 레코드에 대해 작동하는 쿼리는 다음과 같이 테이블의 각 행을 통해 실행되도록 프로 시저로 래핑 될 수 있습니다.

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;

다음은 귀하의 예에 따른 절차입니다 (명확성을 위해 table_A 및 table_B 사용)

CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO
  INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
  SET i = i + 1;
END WHILE;
End;
;;

그런 다음 구분 기호를 재설정하는 것을 잊지 마십시오

DELIMITER ;

그리고 새로운 절차를 실행하십시오.

CALL ROWPERROW();

예제 요청에서 단순히 복사 한 “INSERT INTO”줄에서 원하는대로 할 수 있습니다.

여기에 사용 된 “INSERT INTO”행은 질문의 행을 미러링합니다. 이 답변에 대한 설명에 따라 쿼리가 실행중인 SQL 버전에 대해 구문 상 올바른지 확인해야합니다.

ID 필드가 증가하고 1에서 시작하는 간단한 경우 예제의 행은 다음과 같을 수 있습니다.

INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;

“SELECT COUNT”줄을

SET n=10;

table_A의 처음 10 개 레코드에서만 쿼리를 테스트 할 수 있습니다.

마지막 한가지. 이 프로세스는 또한 여러 테이블에 걸쳐 중첩하기가 매우 쉽고 부모 테이블의 각 행에서 새 테이블에 다른 수의 레코드를 동적으로 삽입하는 프로세스를 하나의 테이블에서 수행 할 수있는 유일한 방법이었습니다.

더 빨리 실행해야하는 경우에는 기반으로 설정하도록하십시오. 그렇지 않으면 괜찮습니다. 위의 내용을 커서 형태로 다시 작성할 수도 있지만 성능이 향상되지 않을 수 있습니다. 예 :

DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;

CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
  DECLARE cursor_ID INT;
  DECLARE cursor_VAL VARCHAR;
  DECLARE done INT DEFAULT FALSE;
  DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO cursor_ID, cursor_VAL;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
  END LOOP;
  CLOSE cursor_i;
END;
;;

쿼리 된 테이블의 것과 동일한 유형으로 사용할 변수를 선언해야합니다.

내 조언은 가능하면 setbased 쿼리를 사용하고 필요한 경우 간단한 루프 또는 커서 만 사용하는 것입니다.


답변

두 개의 쿼리 (기본 삽입)를 포함하는 집합 기반 솔루션을 실제로 사용해야합니다.

INSERT INTO TableB (Id2Column, Column33, Column44)
SELECT id, column1, column2 FROM TableA

UPDATE TableA SET column1 = column2 * column3

그리고 변형을 위해 :

INSERT INTO TableB (Id2Column, Column33, Column44)
SELECT
    id,
    column1 * column4 * 100,
    (column2 / column12)
FROM TableA

UPDATE TableA SET column1 = column2 * column3

이제 변환이 그보다 복잡하고 여러 테이블이 포함 된 경우 세부 정보와 함께 다른 질문을 게시하십시오.


답변

CURSORS는 여기에서 옵션이지만 쿼리 엔진을 가장 잘 사용하지 않는 경우가 많기 때문에 일반적으로 눈살을 찌푸립니다. CURSOR를 사용하지 않고 원하는 작업을 수행 할 수 있는지 확인하려면 ‘SET 기반 쿼리’를 조사해보십시오.


답변

MySQL 트리거에서 사용한 Mr Purple의 예는

begin
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
Select COUNT(*) from user where deleted_at is null INTO n;
SET i=0;
WHILE i<n DO
  INSERT INTO user_notification(notification_id,status,userId)values(new.notification_id,1,(Select userId FROM user LIMIT i,1)) ;
  SET i = i + 1;
END WHILE;
end


답변

    Use this:

    $stmt = $user->runQuery("SELECT * FROM tbl WHERE ID=:id");
    $stmt->bindparam(":id",$id);
    $stmt->execute();

        $stmt->bindColumn("a_b",$xx);
        $stmt->bindColumn("c_d",$yy);


    while($rows = $stmt->fetch(PDO::FETCH_BOUND))
    {
        //---insert into new tble
    }


답변