모든 열을 비교하는 MariaDB/MySQL을 제외한 다른 방법
MariaDB와 MySQL은 EXCLE을 지원하지 않습니다.나는 다음과 같은 것에 대한 대안을 찾고 싶다.
SELECT * FROM table
EXCEPT
SELECT * FROM backup_table
테이블과 backup_table의 스키마가 동일합니다.
제가 본 모든 게시물은 "WHERE column IN (...)"을 사용하여 하나의 컬럼을 비교하도록 제안합니다.제 경우에는 테이블마다 두 테이블 사이의 모든 열을 비교해야 한다는 것이 문제입니다.데이터베이스 내의 변경을 찾기 위해 모든 테이블을 루핑하는 절차 또는 함수로서 작성하려고 합니다.기본적으로 모든 테이블에 업데이트되거나 삽입된 모든 레코드를 찾고 싶습니다.
만약 내가 그 일에 직면한다면, 나는 안티-조인 패턴을 사용할 것이다.이는 현재 테이블의 모든 행과 백업 테이블의 "일치" 행을 반환하는 외부 결합입니다.그런 다음 WHERE 절에서는 정확히 일치하는 모든 행을 제외합니다.일치하지 않는 행을 반환하는 중입니다.
SELECT t.*
FROM mytable t
LEFT
JOIN backup_mytable s
ON s.id <=> t.id
AND s.col_two <=> t.col_two
AND s.col_three <=> t.col_three
AND ...
WHERE s.id IS NULL
이것은 컬럼이idNULL이 아닌 것을 보증합니다.PRIMAY KEY 열(또는 테이블의 PRIMAY KEY의 일부인 열 또는 NOT NULL 제약 조건이 있는 열이 사용됩니다.)
이 쿼리는 백업 테이블의 행과 일치하지 않는 행만 반환합니다.행이 존재하지 않는지 또는 열의 값이 변경되었는지 여부를 나타내지 않습니다.
백업 테이블의 행과 일치하지 않는 원래 테이블의 행을 가져오려면 테이블 이름만 바꾸면 됩니다.
모든 열이 NOT NULL로 정의된 테이블의 특수한 경우 조인 술어에 대한 바로 가기를 사용할 수 있습니다.
FROM mytable t
NATURAL
LEFT
JOIN backup_mytable s
WHERE s.id IS NULL
이는 양쪽 테이블에서 이름이 동일한 모든 열의 USING 절이 있는 LEFT JOIN과 동일합니다.
FROM mytable t
LEFT
JOIN backup_mytable s
USING (id, col_two, col_three, ...)
WHERE s.id IS NULL
이는 모든 열에 동일성 비교를 지정하는 것과 같습니다(두 표에 동일한 열이 있는 경우).
FROM mytable t
LEFT
JOIN backup_mytable s
ON s.id = t.id
AND s.col_two = t.col_two
AND s.col_three = t.col_three
어느 열에서나 NULL 값이 발생하면 동등 비교가 중단되고 NULL이 반환됩니다.
그래서 첫 번째 쿼리는 null-safe 비교를 사용합니다.<=>(7) 오퍼레이터 NULL <=> NULLTRUE가 반환됩니다.NULL = NULL는 NULL을 반환합니다.
첫 번째 쿼리 패턴에서는 모든 컬럼의 비교를 지루하게 입력하는 대신 SQL을 사용하여 필요한 SQL을 생성할 수 있습니다.
SELECT CONCAT(' AND s.`',c.column_name,'` <=> t.`',c.column_name,'`') AS `-- stmt`
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase'
AND c.table_name = 'mytable'
ORDER BY c.ordinal_position
그 쿼리에 의해 반환된 행을 가져와서
SELECT t.*
FROM ... t
JOIN ... s
ON 1=1
-- paste here --
WHERE s.id IS NULL
ORDER BY t.id
이 명령어에만 일치하는 쿼리가 필요한 경우id어떤 열이 변경되었는지 식별하기 위해 SELECT 목록에서 식을 사용합니다.예를 들어 다음과 같습니다.
SELECT s.`id` <=> t.`id` AS `match_id`
, s.`col_one` <=> t.`col_one` AS `match_col_one`
, s.`col_three` <=> t.`col_three` AS `match_col_three`
FROM mytable t
JOIN backup_mytable s
ON s.id = t.id
HAVING NOT match_col_one
목록의 합니다.HAVING값이 합니다.col_one한다.여기서, 행은 반환한다.col_one하다
다시 한 번, 쿼리 작성 프로세스의 속도를 높이기 위해 information_schema.columns에 대해 SQL을 사용합니다.
MySQL이나 MariaDB에 대한 경험이 많지 않지만, 당신에게 유용할 수 있는 다른 질문에 대한 답변으로 이 사실을 알게 되었습니다.
SELECT *
FROM match m
WHERE NOT EXISTS
(
SELECT 1
FROM email e
WHERE e.id = m.id
)
다음 투고에서 Quassnoi에게 크레딧이 돌아옵니다.MySQL SELECT x FROM A WHERE NOT IN (SELECT x FROM b ) - 예기치 않은 결과
버전 10.3.0부터 MariaDB는 EXEC를 포함하지만 이에 국한되지 않는 누락된 집합 작업에 대한 지원을 추가했습니다.
CREATE TABLE `table` ( `item` VARCHAR(1) NOT NULL );
CREATE TABLE `backup_table` ( `item` VARCHAR(1) NOT NULL );
INSERT INTO `table` VALUES ( 'a' ), ( 'b' ), ( 'c' );
INSERT INTO `backup_table` VALUES ( 'a' ), ( 'b' ), ( 'd' );
SELECT * FROM `table`
EXCEPT
SELECT * FROM `backup_table`;
+------+
| item |
+------+
| c |
+------+
언급URL : https://stackoverflow.com/questions/42497577/alternative-for-except-for-mariadb-mysql-comparing-all-columns
'programing' 카테고리의 다른 글
| 서버를 다시 시작하지 않고 MySQL 쿼리 캐시 지우기 (0) | 2023.01.15 |
|---|---|
| MySQL : 저장 프로시저 내의 트랜잭션 (0) | 2023.01.15 |
| PHP에서 PDF를 편집하시겠습니까? (0) | 2023.01.15 |
| PHP에서 redoc을 사용하는 장점은 무엇입니까? (0) | 2023.01.14 |
| MySQL에서 쿼리 캐시를 해제해야 합니까? (0) | 2023.01.14 |