2011-04-05 4 views
0

각 channel_id에 대해 보관 된 값의 테이블이 있지만 사용 가능한 각 channel_id의 현재 값을 유지하려고합니다. 먼저 별도의 테이블에 넣으려고했지만 각각의 select 쿼리에 대해 테이블에 대한 합집합을 사용하는 것이 매우 어려웠습니다 (두 테이블의 결합을 보았습니다).MySQL 업데이트가있는 경우 insert

그래서 가장 좋은 대안은 아카이브 된 데이터의 테이블에 현재 값인지 여부를 나타내는 추가 열을 유지하는 것입니다.

그럼 내 질문은 행이 동일한 channel_id와 현재 열이 1이 아니고 존재하는 경우 업데이트하면 그 테이블에 현재 값을 어떻게 추가합니까?

많은 channel_ids에 current = 0이 있기 때문에 channel_id와 current를 모두 참조하는 고유 색인을 만드는 방법을 볼 수 없습니다. 따라서 replace가 작동하지 않습니다. 행이 아직 존재하지 않기 때문에 업데이트가 항상 작동하지는 않습니다.

더 좋은 솔루션이 있습니까? 이 표에는 수백만 개의 항목이 있으며 수십만 개의 channel_ids가 있습니다.

편집

CREATE TABLE `data` (
`date_time` decimal(26,6) NOT NULL, 
`channel_id` mediumint(8) unsigned NOT NULL, 
`value` varchar(40) DEFAULT NULL, 
`status` tinyint(3) unsigned DEFAULT NULL, 
`connected` tinyint(1) unsigned NOT NULL, 
`current` tinyint(1) unsigned DEFAULT NULL, 
PRIMARY KEY (`channel_id`,`date_time`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 


CREATE TABLE `current` (
`date_time` decimal(26,6) NOT NULL, 
`channel_id` mediumint(8) unsigned NOT NULL, 
`value` varchar(40) DEFAULT NULL, 
`status` tinyint(3) unsigned DEFAULT NULL, 
`connected` tinyint(1) unsigned NOT NULL, 
PRIMARY KEY (`channel_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

이 내가 현재 처리하고있는 테이블입니다. 나는 (데이터 테이블의 현재 열이 필요하지 않은 경우) 쿼리에 대해 이들을 결합하는 좋은 방법을 찾고 싶습니다. 또는 데이터 테이블을 사용하고 주어진 channel_id에 대해 현재 channel_id에 대한 하나의 행을 찾습니다. = 1이고 존재하는 경우 새로운 date_time, value, status 및 connected로 업데이트하십시오. 하나도 존재하지 않는다면 같은 값으로 추가하십시오. MySQL의의 ON DUPLICATE KEY UPDATE 구문

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

답변

1
+0

내 질문에 REPLACE (교체)와 UPDATE (교체)를 바꿨을 것입니다. 나는 그것을 고치기 위해 편집했다. 고유 한 값의 전체 열을 만들지 않는 한 channel_id 및 current에 대한 고유 인덱스를 만드는 방법을 볼 수 없기 때문에 REPLACE를 사용할 수 있다고 생각하지 않습니다. – Patrick

3

봐 당신은 절대적으로 화합물 UNIQUE 키를 생성 할 수 있습니다.

CREATE UNIQUE INDEX ON table_name (`channel_id`, `current`); 

그런 다음, 다른 답변에 따라, 당신은 업데이트 할 REPLACE 또는 ON DUPLICATE를 사용할 수 있습니다. 분명히 이것은 끔찍한 생각이며 아마도 테이블의 개혁은 일어날 것입니다. 그러나 그것은 효과가있을 것입니다.

+0

channel_id와 current에 고유 한 ID를 만드는 방법을 볼 수 없기 때문에 사용할 수 있다고 생각하지 않습니다. – Patrick

+0

** VALUES (col_name) ** 접근자를 사용하여 UPDATE 문에서 전달 된 값을 참조하는 것을 잊지 마십시오. 나는 그것이 필요한 첫 번째 예를 들어야 만했다. –

0

에서

+0

그러나 동일한 channel_id와 current = 0을 가진 많은 행이 있다면? 어떻게 표를 바꿀 수 있습니까? – Patrick

+0

'current'와 같은 것을 사용하지 말고 대신'archived_date'와 같은 것을 사용하십시오. 즉, 날짜를 업데이트해야하지만이 시점에서 할 수있는 일은 거의 없습니다. –

+0

모든 값은 현재 값을 포함하여 해당 값과 연관된 유닉스 시간을 갖습니다. 하지만 때로는 현재 값이 아카이브 된 값이 될 것이고, 나는 그것을 덮어 쓰고 싶지 않을 것입니다. – Patrick

관련 문제