테이블 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
}