중복 키 업데이트 시 삽입과 동일
여기저기 찾아봤지만 그게 가능한지 못 찾았어요.
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 고유의 확장이 있습니다.
그러나 '복제 업데이트 시'와 완전히 동일하게 작동하지 않습니다.
새 행과 충돌하는 이전 행을 삭제하고 새 행을 삽입합니다.테이블 상에 프라이머리 키가 없는 한, 프라이머리 키가 있는 경우 다른 테이블에서 해당 프라이머리 키를 참조하고 있는 경우
이전 행의 값을 참조할 수 없으므로 다음과 같은 작업을 수행할 수 없습니다.
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;
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';
스크립트 언어를 사용하여 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
'programing' 카테고리의 다른 글
어레이의 모든 요소를 Java의 특정 값으로 초기화하는 방법 (0) | 2022.12.28 |
---|---|
특정 구성 요소에 대해 특정 Vue 경고를 사용하지 않도록 설정할 수 있습니까? (0) | 2022.12.18 |
SQL: SELECT WHERE(VARCHAR 열) Moodle이 있는 행을 찾을 수 없습니다.오류 "데이터베이스 테이블 external_functions에서 데이터 레코드를 찾을 수 없습니다." (0) | 2022.11.08 |
주피터 노트북의 셀을 접다 (0) | 2022.11.08 |
"java.nio.charset"을 피하기 위한 모든 포함 문자 집합.잘못된 입력 예외:입력 길이 = 1인치? (0) | 2022.11.08 |