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

나는 주변을 검색했지만 가능한지 찾지 못했습니다.

나는이 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이미로 설정 2하는 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;

를 얻으려면 id에서 LAST_INSERT_ID; 동일한 백엔드 앱을 지정해야합니다.

LuaSQL의 경우 a conn:getlastautoid()가 값을 가져옵니다.


답변

SQL에 대한 MySQL 특정 확장이 있습니다. REPLACE INTO

그러나 ‘ON DUPLICATE UPDATE’와 완전히 동일하지 않습니다.

  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;

ID를 얻으려면 해결 방법을 사용하고 싶습니다!

기본 키가 자동 증가하는 동안 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> user </ code> 테이블

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

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

또는 다음과 같이 GUI에서 두 개의 열 색인을 작성하십시오 .
GUI에서 인덱스 생성
색인을 생성 할 열 선택
<code> user </ code> 테이블의 인덱스

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> user </ code> 테이블


답변

당신은 당신의 SQL 쿼리를 준비하는 스크립트 언어를 활용할 수있다 이런 경우에, 당신은 사용하여 필드 = 값 쌍을 다시 사용할 수있는 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 / UNIQUE 키에, 경고, 그것은 삭제되어야 행을하고 INSERTS 새로.

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

주의 사항 :

  • 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/