> 데이터 베이스 > MySQL 튜토리얼 > 기본 키나 고유 제약 조건을 사용하지 않는 DB에서 행 업데이트

기본 키나 고유 제약 조건을 사용하지 않는 DB에서 행 업데이트

Linda Hamilton
풀어 주다: 2024-10-19 10:52:29
원래의
385명이 탐색했습니다.

Upsert a row in a DB that doesn

7년간의 프로그래머 경력 동안 저는 대부분 ORM을 통해 SQL과 상호작용했습니다. 제가 특히 유용하다고 생각하는 Laravel의 Eloquent ORM 기능 중 하나는 updateOrInsert() 메소드입니다:

DB::table('posts')
    ->updateOrInsert(
        ['slug' => 'about'], // matching condition
        ['content' => 'Like and subscribe'] // created or updated values
    );
로그인 후 복사

위의 예에서 Eloquent는 슬러그가 "about"과 같은 행을 post 테이블에서 찾습니다. 해당 슬러그가 포함된 행이 있으면 Eloquent는 해당 행의 내용을 "좋아요 및 구독"으로 업데이트합니다. 해당 슬러그가 포함된 행이 없는 경우 Eloquent는 "about" 슬러그와 "좋아요 및 구독" 내용이 포함된 새 행을 생성합니다.

문제: 기본 키나 고유 제약 조건이 없음

현재 이전 WordPress 사이트에서 새 WordPress 사이트로 페이지 데이터를 이동하기 위한 마이그레이션 스크립트를 작성 중입니다. 스크립트는 이전 사이트의 데이터베이스에 연결한 다음 새 사이트의 데이터베이스로 가져올 수 있는 SQL 파일을 생성합니다. 새 사이트에는 이미 수동으로 이동한 일부 페이지가 있지만 해당 콘텐츠가 최신 상태가 아닐 수 있습니다. 새 사이트에 페이지가 이미 존재하는 경우 해당 페이지를 다시 생성하고 싶지 않고 이미 존재하는 페이지를 업데이트하고 싶습니다. 페이지의 URL 슬러그에 해당하는 WordPress 데이터베이스의 post_name 열을 사용하여 페이지가 이미 존재하는지 확인할 수 있습니다.

post_name이 기본 키인 경우 REPLACE 문을 사용하여 Eloquent의 createOrUpdate() 메소드와 유사한 작업을 수행할 수 있지만 post_name은 기본 키가 아닙니다.

post_name에 고유 제약 조건이 있는 경우 INSERT ... ON DUPLICATE KEY UPDATE 문을 사용하여 Eloquent의 createOrUpdate() 메서드와 유사한 작업을 수행할 수 있지만 post_name에는 고유 제약 조건이 없습니다.

아, 워드프레스의 즐거움이군요.

MySQL의 IF 문을 살펴봤는데 IF 문은 저장 프로시저, 트리거, 함수에서만 작동합니다. 새 사이트의 데이터베이스로 가져올 SQL 파일에 저장 프로시저를 만들고 싶지 않았기 때문에 다른 옵션을 검색해야 했습니다.

해결책: 2개의 진술

순수 SQL에서 Eloquent의 updateOrInsert() 기능을 에뮬레이트하기 위해 제가 찾을 수 있는 가장 간단한 해결책은 문제를 두 부분으로 나누는 것입니다.

  1. 일치하는 슬러그로 기존 행을 업데이트합니다.
  2. 일치하는 슬러그가 있는 행이 없으면 새 행을 만듭니다.

실제 모습은 다음과 같습니다.

-- Update the post if it already exists.

UPDATE wp_posts
SET post_type = 'page',
    post_title = 'About',
    post_content = 'Like and subscribe'
WHERE post_name = 'about';

-- Create a new post if it does not exist.

INSERT INTO wp_posts (post_name, post_type, post_title, post_content)
SELECT 'about', 'page', 'About', 'Like and subscribe'
WHERE NOT EXISTS (
    SELECT 1
    FROM wp_posts
    WHERE post_name = 'about'
);
로그인 후 복사

참고: 이 예에서는 간결성과 명확성을 위해 WordPress의 필수 wp_posts 열 중 다수를 생략했습니다.

INSERT ... SELECT 문에 대해 알게 된 것은 저에게 '아하' 순간이었습니다. 한 번에 많은 삽입을 수행하기 위해 다른 테이블의 쿼리 결과를 사용하기 위한 것입니다. 그러나 자신만의 값을 제공하고 post_name이 "about"인 게시물이 존재하지 않는 경우에만 삽입을 수행함으로써 SQL의 기능을 악용할 수 있습니다.

이것이 이 문제에 대한 가장 우아하고 효율적인 솔루션입니까? 아마도 그렇지 않을 것입니다. 하지만 WordPress 사이트의 일회성 마이그레이션에는 충분하며 저장 프로시저나 애플리케이션 로직 없이도 행을 업데이트하거나 삽입할 수 있습니다. ORM의 도움 없이 강력한 쿼리를 작성할 때 이 게시물이 도움이 되기를 바랍니다.

위 내용은 기본 키나 고유 제약 조건을 사용하지 않는 DB에서 행 업데이트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿