programing

행이 없는 경우 행을 삽입하는 방법, 그렇지 않으면 MariaDB에서 두 경우 모두 ID를 선택하고 반환하는 방법은 무엇입니까?

batch 2023. 9. 13. 22:25
반응형

행이 없는 경우 행을 삽입하는 방법, 그렇지 않으면 MariaDB에서 두 경우 모두 ID를 선택하고 반환하는 방법은 무엇입니까?

저랑 자리가 있어요.ID기본 키(자동 증분) 및 고유 열Name. MariaDB에서 동일한 경우 이 테이블에 행을 삽입하는 효율적인 방법이 있습니까?Name존재하지 않습니다. 그렇지 않으면 기존 행을 선택하고 두 경우 모두 이 값으로 행의 ID를 반환합니다.Name?

Postgres를 위한 해결책이 있습니다.하지만 MariaDB는 그것을 가지고 있지 않은 것 같습니다.RETURNING id지금까지 시도해 본 것은 단순한 강요입니다.

INSERT IGNORE INTO services (Name) VALUES ('JohnDoe');
SELECT ID FROM services WHERE Name='JohnDoe';

업데이트: MariaDB 10.5는RETURNING하지만 지금까지 시도한 쿼리는 구문 오류를 던집니다.

WITH i AS (INSERT IGNORE INTO services (`Name`) VALUES ('John') RETURNING ID)
SELECT ID FROM i
UNION
SELECT ID FROM services WHERE `Name`='John'

단일 행의 경우 다음과 같이 가정합니다.idAUTO_INCREMENT.

INSERT INTO t (name)
    VALUES ('JohnDoe')
    ON DUPLICATE KEY id = LAST_INSERT_ID(id);
SELECT LAST_INSERT_ID();

그것은 지저분해 보이지만, 설명서에 나와 있는 예시입니다.

주의:대부분의 형태는INSERTauto_incids를 "burn"할 것입니다.즉, ID가 사용되지 않을 것이라는 것을 인지하기 전에 다음 ID를 가져옵니다.이로 인해 최대 auto_inc 크기가 오버플로될 수 있습니다.

코드의 "고기"를 하는 거래 안에 정규화를 넣지 않는 것도 현명합니다.테이블을 불필요하게 길게 묶고 롤백할 경우 ID를 태울 위험이 추가됩니다.

이와 같은 '정규화' 테이블의 일괄 업데이트에 대해서는 http://mysql.rjweb.org/doc.php/staging_table#normalization 을 참조하십시오. ID를 굽지 않습니다.

언급URL : https://stackoverflow.com/questions/62931193/how-to-insert-a-row-if-not-exists-otherwise-select-and-return-its-id-in-both-cas

반응형