HOWTO · MySQL
존재하는 경우 레코드 업데이트 그렇지 않으면 MySQL 테이블에 삽입
오늘의 게시물에서는 MySQL 테이블의 레코드가 있는 경우 업데이트하고 그렇지 않은 경우 삽입하는 방법을 알아봅니다.
데이터베이스 관리자는 때때로 MySQL 테이블에 레코드를 추가하거나 레코드가 정기적으로 있는 경우 업데이트해야 할 수 있습니다. MySQL은 사용자가 이미 존재하거나 PRIMARY KEY 값이 중복된 레코드를 삽입하려고 하면 경고를 보냅니다.
이 문서에서는 이 실수를 수정하고 더 나은 결과를 얻는 데 사용할 수 있는 방법에 대해 설명합니다.
존재하는 경우 레코드 업데이트 그렇지 않으면 MySQL 테이블에 삽입
행이 실제로 새롭거나 이미 존재하는지 확인한 후 행을 삽입해야 하는 경우 MySQL은 몇 가지 유용한 명령문을 제공합니다.
레코드가 존재하는 경우 REPLACE INTO를 사용하여 레코드 업데이트 그렇지 않으면 MySQL 테이블에 삽입
한 가지 방법은 이전에 설명한 것처럼 중복된 UNIQUE 또는 PRIMARY KEY 값으로 인해 INSERT 명령이 실패할 때 행을 진정으로 바꾸려는 경우 REPLACE 문을 사용하는 것입니다.
REPLACE INTO 문을 사용할 때 실행된 각 명령에 대해 두 가지 가능한 결과가 있습니다.
- 원하는 값이 있는 데이터 행을 찾을 수 없기 때문에 일반적인
INSERT문이 실행됩니다. - 일치하는 데이터 행이 발견되면 일반적인
DELETE문을 사용하여 기존 행이 지워지고 표준INSERT가 수행됩니다.
예를 들어 id, department, employee_name 및 joining_year 열이 있는 employees 테이블이 있다고 가정합니다. department 및 joining_year의 id = 101 레코드를 다시 원래 Operations 레코드로 변경하기로 결정했습니다.
-- Before update
SELECT * from employees where id = 101;
REPLACE INTO employees
(id, department, employee_name, joining_year)
VALUES
(101, 'Operations', 'John Doe', 2013);
-- After update
SELECT * from employees where id = 101;
MySQL과 호환되는 모든 브라우저에서 위의 코드 줄을 실행합니다. 다음과 같은 결과가 표시됩니다.
출력:
-- Before update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Technology | John Doe | 2017 |
+----+------------+---------------+----------------+
Query OK, 2 rows affected (0.01 sec)
-- After update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Operations | John Doe | 2013 |
+----+------------+---------------+----------------+
이 예에서는 하나의 항목만 변경했지만 이전 레코드를 삭제한 다음 새 행을 삽입하여 그 자리를 차지하기 때문에 두 행이 영향을 받은 것으로 결과가 표시됩니다.
INSERT ... ON DUPLICATE KEY UPDATE를 사용하여 레코드가 존재하는 경우 업데이트하고 그렇지 않으면 MySQL 테이블에 삽입
중복된 UNIQUE 또는 PRIMARY KEY 값이 있을 수 있는 행에 삽입하기 위한 대체 접근 방식으로 INSERT ... ON DUPLICATE KEY UPDATE 문 및 절을 사용할 수 있습니다.
INSERT 또는 UPDATE 명령만 실행하고 DELETE를 사용하지 않음으로써 INSERT... ON DUPLICATE KEY UPDATE를 사용하는 것은 REPLACE와 달리 비파괴적입니다. 필요할 때 실행되는 명령.
예를 들어 id, department, employee_name 및 joining_year 열이 있는 employees 테이블이 있다고 가정합니다. department 및 joining_year의 id = 101 레코드를 다시 원래 Operations 레코드로 변경하기로 결정했습니다.
이제 새 ON DUPLICATE KEY UPDATE 절을 원래 INSERT 문에 추가할 수 있습니다.
-- Before update
SELECT * from employees where id = 101;
SET @id = 101,
@department = 'Operations',
@employee_name = 'John Doe',
@joining_year = 2013;
INSERT INTO employees
(id, department, employee_name, joining_year)
VALUES
(@id, @department, @employee_name, @joining_year)
ON DUPLICATE KEY UPDATE
department = @department,
employee_name = @employee_name,
joining_year = @joining_year;
-- After update
SELECT * from employees where id = 101;
위의 예에서는 ON DUPLICATE KEY UPDATE 방법이 작동하는 데 필요하지 않더라도 INSERT 또는 UPDATE에 원하는 실제 값을 두 번 이상 선언하지 않도록 사용자 변수를 사용하도록 선택했습니다. 의도 한대로.
MySQL과 호환되는 모든 브라우저에서 위의 코드 행을 실행하십시오. 다음과 같은 결과가 표시됩니다.
출력:
-- Before update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Technology | John Doe | 2017 |
+----+------------+---------------+----------------+
Query OK, 1 rows affected (0.00 sec)
-- After update
+----+------------+---------------+----------------+
| id | department | employee_name | year_published |
+----+------------+---------------+----------------+
|101 | Operations | John Doe | 2013 |
+----+------------+---------------+----------------+