MySQL ForEach 루프
Mehvish Ashiq
2023년6월20일
이 튜토리얼은 하나의 명령문에서 INSERT
, SELECT
, WHERE
및 JOIN
을 사용하여 MySQL에서 foreach
루프를 시뮬레이트하는 방법을 안내합니다.
MySQL foreach
루프
foreach
루프 시뮬레이션을 이해하기 위해 이름과 속성 이름이 아래에 제공된 세 개의 테이블을 생성해 보겠습니다.
테이블 및 해당 속성:
users -> id, user_name, person_id, email
person -> id, person_name, address_id
address -> id, email
다음 쿼리를 사용하여 테이블을 만듭니다.
# create `address`, `person`, and `users` tables
CREATE TABLE address(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(45) NULL
);
CREATE TABLE person (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
person_name VARCHAR(45) NOT NULL,
address_id INT NULL,
FOREIGN KEY (address_id) REFERENCES address(id)
);
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
person_id INT NOT NULL,
email VARCHAR(45) NOT NULL,
FOREIGN KEY (person_id) REFERENCES person(id)
);
또한 아래의 MySQL 쿼리를 사용하여 방금 만든 테이블에 데이터를 삽입합니다.
# insert data into the `address` table. Here
# we have parenthesis only because one field
# is `auto_incremented`, and the other can accept
# `null`.
INSERT INTO address () VALUES (),(),(),();
# insert data into the `person` table
INSERT INTO person (person_name)
VALUES
('Thomas Christopher'),
('Jim James'),
('Mehvish Ashiq'),
('Saira Daniel');
# insert data into the `users` table
INSERT INTO users(user_name, person_id, email)
VALUES
('chthomas', 1, 'chthomas@yahoo.com'),
('jjames', 2, 'jimjames@gmail.com'),
('mehvishashiq', 3, 'mehvish@yahoo.com'),
('danielsaira', 4, 'sairad@gmail.com');
다음으로 SELECT
문을 사용하여 최근 데이터를 확인합니다.
# display data for all the specified tables
SELECT * FROM users;
SELECT * FROM person;
SELECT * FROM address;
출력(users
테이블의 경우):
+----+--------------+-----------+--------------------+
| id | user_name | person_id | email |
+----+--------------+-----------+--------------------+
| 1 | chthomas | 1 | chthomas@yahoo.com |
| 2 | jjames | 2 | jimjames@gmail.com |
| 3 | mehvishashiq | 3 | mehvish@yahoo.com |
| 4 | danielsaira | 4 | sairad@gmail.com |
+----+--------------+-----------+--------------------+
4 rows in set (0.00 sec)
출력(person
테이블의 경우):
+----+--------------------+------------+
| id | person_name | address_id |
+----+--------------------+------------+
| 1 | Thomas Christopher | NULL |
| 2 | Jim James | NULL |
| 3 | Mehvish Ashiq | NULL |
| 4 | Saira Daniel | NULL |
+----+--------------------+------------+
4 rows in set (0.00 sec)
출력(주소
테이블용):
+----+-------+
| id | email |
+----+-------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
+----+-------+
4 rows in set (0.11 sec)
users.person_id
가 NOT NULL
이고 person.address_id
가 NULL
인 경우 address
테이블에 새 레코드를 생성해야 합니다. 새로 생성된 행의 정확한 이메일은 users.email
입니다.
여기에서 다음과 같은 방식으로 foreach
루프를 시뮬레이션할 수 있습니다.
# simulation of `foreach loop`
INSERT INTO address (email) SELECT users.email
FROM users JOIN person ON users.person_id = person.id
WHERE person.address_id IS NULL;
그런 다음 SELECT
쿼리를 사용하여 업데이트된 데이터를 확인합니다.
SELECT * FROM address;
출력:
+----+--------------------+
| id | email |
+----+--------------------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
| 5 | chthomas@yahoo.com |
| 6 | jimjames@gmail.com |
| 7 | mehvish@yahoo.com |
| 8 | sairad@gmail.com |
+----+--------------------+
8 rows in set (0.00 sec)
그러나 커서 및 프로시저를 사용하여 위의 쿼리를 실행할 수도 있습니다.
작가: Mehvish Ashiq