2013-08-05 5 views
0

어리석은 질문 일 수 있습니다.mySQL의 REPLACE 기능을 사용한 색인 열

나는 및 가입 모두 이 많이 사용해야하는 경우 :

REPLACE(table_a.column_1, '-', '') = REPLACE(table_b.column_2, '-', '') 

다른 회사의 시스템에서 비트 데이터 불일치가

다른 데이터베이스 유형이 할 수있는 가능성이있다 또는 이후 REPLACE 함수가있는 열의 인덱스가 있습니까? 예 :

ALTER TABLE `table_a` ADD INDEX (REPLACE(`column_1`, '-', '')) ; 

데이터베이스 유형 :의 MyISAM

+0

왜 'table_a.column_1 = table_b.column_2'가 여기서 작동하지 않습니까? – Achrome

+0

어딘가에 변수에 Funtion을 사용하면 인덱스를 사용하지 않으며 함수 출력이 결정되지 않기 때문에 함수에 대한 인덱스를 만들 수 없습니다. 따라서 내 대답은 –

+0

입니다 @AshwinMukhija 아마도 그의 데이터는 다른 회사의 db 그때 그들은 ... –

답변

2

는 MySQL은 computed column 같은 것은 없다.

속도 향상 색인 검색에 일부 값의 형식을 지정하려면 일부 트리거를 사용해야합니다. 사실 나는 비슷한 질문에 대해 https://stackoverflow.com/a/18047511/2363712을 참조하십시오.

CREATE TABLE `table_a`(`column_1` VARCHAR(255), ... , 
         `column_1_fmt` VARCHAR(255), 
         INDEX(`column_1_fmt`)); 

CREATE TRIGGER ins_table_a BEFORE INSERT ON `table_a` 
FOR EACH ROW 
    SET NEW.`column_1_fmt` = REPLACE(NEW.column_1, '-', ''); 

CREATE TRIGGER upd_table_a BEFORE UPDATE ON `table_a` 
FOR EACH ROW 
    SET NEW.`column_1_fmt` = REPLACE(NEW.column_1, '-', ''); 

지금 당신은/값을 검색 필요한 형식을 가진 값에 가입 column_1_fmt를 사용합니다 : 그런 식으로 이어질 것입니다 귀하의 경우에는

. 당신의 특별한 필요에 관하여


(대시을 제거 - 시리얼/참조 번호의 어떤 종류에서 참조). 어쩌면 문제를 되돌려 놓아야합니다. 그 값을 정식 양식 (대시 없음)으로 저장하십시오. 그리고 SELECT 시간에 필요한 대시를 추가하십시오.