programing

중복 키 업데이트 시 삽입과 동일

kingscode 2022. 12. 18. 20:15
반응형

중복 키 업데이트 시 삽입과 동일

여기저기 찾아봤지만 그게 가능한지 못 찾았어요.

MySQL 쿼리는 다음과 같습니다.

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)

필드 ID에는 "고유 인덱스"가 있으므로 두 개일 수 없습니다.같은 ID가 이미 데이터베이스에 존재한다면 갱신하고 싶습니다.그러나 다음과 같은 필드를 모두 다시 지정해야 합니까?

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8

또는 다음 중 하나를 선택합니다.

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)

이미 삽입물에 있는 모든 것을 지정했습니다...

덧붙여서, ID를 입수하기 위해 작업을 하고 싶습니다!

id=LAST_INSERT_ID(id)

누가 가장 효율적인 방법이 뭔지 말해줬으면 좋겠어요.

UPDATE스테이트먼트는 오래된 필드를 새로운 값으로 갱신할 수 있도록 지정됩니다.이전 값과 새 값이 같다면 어떤 경우에도 업데이트해야 하는 이유는 무엇입니까?

컬럼이 를, 이 등인 a로로 합니다.g are are are are are are are are are are are are 로 설정되어 있습니다.2 to 로.8; 다시 업데이트해야 할 필요가 없습니다.; ; 다시 업데이트할 필요가 없습니다.

또는 다음을 사용할 수 있습니다.

INSERT INTO table (id,a,b,c,d,e,f,g)
VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY
    UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g;

수 법 방 the to get입?id부에서LAST_INSERT_ID; 동일한 용도로 사용하는 백엔드 앱을 지정해야 합니다.; ; 같은 용도로 사용할 백엔드 앱을 지정해야 합니다.

루ASQL에 대한 루AQL ,conn:getlastautoid()값을 가져옵니다.

SQL에 대한 MySQL 고유의 확장이 있습니다.

그러나 '복제 업데이트 시'와 완전히 동일하게 작동하지 않습니다.

  1. 새 행과 충돌하는 이전 행을 삭제하고 새 행을 삽입합니다.테이블 상에 프라이머리 키가 없는 한, 프라이머리 키가 있는 경우 다른 테이블에서 해당 프라이머리 키를 참조하고 있는 경우

  2. 이전 행의 값을 참조할 수 없으므로 다음과 같은 작업을 수행할 수 없습니다.

    INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) 
    ON DUPLICATE KEY UPDATE
    id=1, a=2, b=3, c=c + 1;
    

아이디를 입수하기 위해 작업을 하고 싶습니다!

동작합니다.프라이머리 키가 자동으로 증가하고 있는 한 last_insert_id()는 올바른 값을 가져야 합니다.

그 를 실제로 테이블에서 하면, 그 기본키를 사용할 수 있습니다.REPLACE INTO고유 키를 통해 충돌한 오래된 행을 삭제하기 때문에 허용되지 않을 수 있습니다.

다음 작업을 수행하여 일부 입력을 줄이려면 다른 사용자가 먼저 제안했습니다.

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

다른 방법이 없어요, 모든 것을 두 번 지정해야 해요.첫 번째는 삽입이고, 두 번째는 업데이트 케이스입니다.

문제 해결 방법은 다음과 같습니다.

저는 당신과 같은 문제를 해결하려고 노력했습니다.심플한 관점에서 테스트하는 것을 제안하고 싶습니다.

다음의 순서에 따라 주세요:심플한 솔루션으로부터 학습합니다.

1단계: 다음 SQL 쿼리를 사용하여 테이블 스키마를 만듭니다.

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(32) NOT NULL,
  `status` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `no_duplicate` (`username`,`password`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

데이터가 있는 테이블 <code> 사용자 </code>

2단계: 다음 SQL 쿼리를 사용하여 데이터 중복을 방지하기 위해 두 열의 인덱스를 만듭니다.

ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);

또는 다음과 같이 GUI에서2 컬럼의 인덱스를 만듭니다.

3단계: 있는 경우 업데이트하고 다음 쿼리를 사용하지 않으면 삽입합니다.

INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal';

INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal';

위의 쿼리를 실행한 후의 표 <code> 사용자 </code>

스크립트 언어를 사용하여 SQL 쿼리를 준비할 수 있는 경우 field=값 쌍을 다시 사용할 수 있습니다.SET대신(a,b,c) VALUES(a,b,c).

PHP를 사용한 예:

$pairs = "a=$a,b=$b,c=$c";
$query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs";

표 예:

CREATE TABLE IF NOT EXISTS `tester` (
  `a` int(11) NOT NULL,
  `b` varchar(50) NOT NULL,
  `c` text NOT NULL,
  UNIQUE KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

다음을 사용하는 것이 좋습니다.REPLACE INTO그러나 Primary/UNIQUIE 키가 중복되면 을 삭제하고 새 행을 삽입합니다.

모든 필드를 다시 지정할 필요는 없습니다.그러나 가능한 성능 저하(테이블 설계에 따라 다름)를 고려해야 합니다.

경고:

  • AUTO_INCREMENT 기본 키가 있는 경우 새 키가 지정됩니다.
  • 인덱스를 업데이트해야 할 수 있습니다.

늦은 건 알지만 이 답변에 누군가 도움을 주셨으면 합니다.

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

아래 튜토리얼을 읽어보실 수 있습니다.

https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/

http://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/

MySQL v8.0.19 이상에서는 다음 작업을 수행할 수 있습니다.mysql doc

INSERT INTO mytable(fielda, fieldb, fieldc) 
VALUES("2022-01-01", 97, "hello") 
AS NEW(newfielda, newfieldb, newfieldc) 
ON DUPLICATE KEY UPDATE
fielda=newfielda,
fieldb=newfieldb,
fieldc=newfieldc;


SIDENOTE: 또한 중복된 키 업데이트 부분에 조건을 붙이려면 MySQL에 반전이 있습니다. fielda를 첫 번째 인수로 업데이트하고 fieldb의 IF 구에 포함시키면 이미 새 값으로 업데이트됩니다.끝까지 또는 똑같이 옮기세요.fielda가 예시와 같은 날짜이며 날짜가 이전 날짜보다 새로운 경우에만 업데이트한다고 가정합니다.

INSERT INTO mytable(fielda, fieldb) 
VALUES("2022-01-01", 97) 
AS NEW(newfielda, newfieldb, newfieldc) 
ON DUPLICATE KEY UPDATE
fielda=IF(fielda<STR_TO_DATE(newfielda,'%Y-%m-%d %H:%i:%s'),newfielda,fielda),
fieldb=IF(fielda<STR_TO_DATE(newfielda,'%Y-%m-%d %H:%i:%s'),newfieldb,fieldb);

경우 fieldb<!> 때문에 업데이트되지 않습니다. 그 아래로 fielda의 업데이트를 이동하거나 <= 또는 =...!에 확인해야 합니다.

INSERT INTO mytable(fielda, fieldb) 
VALUES("2022-01-01", 97) 
AS NEW(newfielda, newfieldb, newfieldc) 
ON DUPLICATE KEY UPDATE
fielda=IF(fielda<STR_TO_DATE(newfielda,'%Y-%m-%d %H:%i:%s'),newfielda,fielda),
fieldb=IF(fielda=STR_TO_DATE(newfielda,'%Y-%m-%d %H:%i:%s'),newfieldb,fieldb);

fielda가 fieldb의 if 절에 도달하기 전에 이미 값으로 업데이트되었기 때문에 =를 사용하면 예상대로 작동합니다.저는 개인적으로 <=>가 가장 마음에 듭니다만, 만약 당신이 그 문장을 다시 정리한다면...

이러한 경우 insert ignore를 사용할 수 있습니다. 중복된 레코드가 있을 경우 무시됩니다. IGNORE ... ; -- 중복된 키가 ON이 아닌 경우

언급URL : https://stackoverflow.com/questions/14383503/on-duplicate-key-update-same-as-insert

반응형