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 파일에 저장 프로시저를 만들고 싶지 않았기 때문에 다른 옵션을 검색해야 했습니다.
순수 SQL에서 Eloquent의 updateOrInsert() 기능을 에뮬레이트하기 위해 제가 찾을 수 있는 가장 간단한 해결책은 문제를 두 부분으로 나누는 것입니다.
실제 모습은 다음과 같습니다.
-- 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!