나는 주변을 검색했지만 가능한지 찾지 못했습니다.
나는이 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’와 완전히 동일하지 않습니다.
-
새 행과 충돌하는 이전 행을 삭제 한 다음 새 행을 삽입합니다. 테이블에 기본 키가없는 한 괜찮지 만 다른 테이블이 기본 키를 참조하는 경우
-
이전 행의 값을 참조 할 수 없으므로 동등한 행을 수행 할 수 없습니다
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;
2 단계 : 다음 SQL 쿼리를 사용하여 중복 데이터를 방지하기 위해 두 열의 인덱스를 만듭니다 .
ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);
또는 다음과 같이 GUI에서 두 개의 열 색인을 작성하십시오 .
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 쿼리를 준비하는 스크립트 언어를 활용할 수있다 이런 경우에, 당신은 사용하여 필드 = 값 쌍을 다시 사용할 수있는 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/