2014-07-07 1 views
1

구조 테이블 :INSERT ... ON DUPLICATE를 사용하는 방법?

CREATE TABLE IF NOT EXISTS `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `rows_id` int(11) NOT NULL, 
    `url_id` int(11) NOT NULL, 
    `keyword_id` int(11) NOT NULL, 
    `date` datetime NOT NULL, 
    `seet` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ; 

STRUCTURE TABLE WITH TEST ROWS ON SQLFIDDLE

쿼리 삽입 : 테이블에 이미 date = '2014 함께 행이있는 경우

INSERT INTO `table` (`id`, `rows_id`, `url_id`, `keyword_id`, `date`, `seet`) 
VALUES 
(1, 1, 2, 1, '2014-05-01 00:00:00', 1); 

나는 삽입이 행이나 업데이트 행 싶습니다 -05-01 00:00:00 '및 rows_id ='1 '및 keyword_id = '1'.

dev.mysql.com 내 질문에 INSERT ... ON DUPLICATE KEY UPDATE을 참조하십시오. 삽입 또는 업데이트하는 방법은 무엇입니까?

+3

날짜 + 다른 컬럼에'Unique' 제약 할 것 :

여기에 빠른 데모입니까? 소리 _Odd_ 그래 –

+3

그래 음 ... 하지마. –

+0

또한 귀하의 제목이 귀하의 질문을 적절히 설명하지 못합니다. –

답변

2

중복 삽입 키 업데이트 (IODKU)는 삽입 한 값이 PRIMARY KEY 또는 UNIQUE KEY를 기반으로 기존 행과 충돌하는 경우에만 업데이트를 수행합니다.

그래서 세 개의 열에 대해 고유 키를 정의해야합니다. 그렇지 않으면 IODKU는 행이 기존 열과 충돌하는지 여부를 알 수 없습니다.

ALTER TABLE `table` ADD UNIQUE KEY (date, rows_id, keyword_id); 

당신은 같은 rows_id 둘 이상의 행을 가질 수 위의 댓글에서 말했다. 괜찮습니다. 고유 제약 조건에 따르면 date, rows_id, keyword_id의 세 값의 동일한 조합을 복제하는 두 개의 행을 가질 수 없습니다. 그러나 세 열의 조합이 고유 한 경우 해당 열 중 하나에서 동일한 값을 갖는 여러 행을 가질 수 있습니다.

mysql> create table t (
    id int auto_increment primary key, 
    d int, 
    r int, 
    k int, 
    unique key(d,r,k) 
); 

mysql> insert into t values (1,1,1,1); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into t values (1,1,1,1) on duplicate key update d = values(d)+1; 
Query OK, 2 rows affected (0.00 sec) 

mysql> select * from t; 
+----+------+------+------+ 
| id | d | r | k | 
+----+------+------+------+ 
| 1 | 2 | 1 | 1 | 
+----+------+------+------+ 
0

귀하의 질문에 대한 이해를 통해 도움이 될 것입니다. 이 SQL 쿼리는 행이 있는지 테스트하고 행을 업데이트하거나 행이 이미 존재하는지 여부에 따라 새 행을 만듭니다.

IF EXISTS (SELECT * FROM table WHERE date = 2014-05-01 00:00:00 AND rows_id = 1 AND keyword_id = 1) 
BEGIN 
    UPDATE table SET Params=values 
END 
ELSE 
BEGIN 
    INSERT INTO `table` (`id`, `rows_id`, `url_id`, `keyword_id`, `date`, `seet`) VALUES (1, 1, 2, 1, '2014-05-01 00:00:00', 1) 
END 

행이있는 경우 (SELECT 문에서 데이터가 반환되는 경우) UPDATE 쿼리가 실행됩니다. 행이 존재하지 않으면 (SELECT 문에서 데이터를 반환하지 않음) INSERT INTO 문이 실행됩니다.

관련 문제