2017-10-01 4 views
2

다음 코드를 업데이트하여 열을 추가 및 삭제하지 않으려면 어떻게해야합니까?MySQL :이 코드를 재구성하여 중간 열을 추가 및 삭제하는 방법

이 코드는 "3 야드"(이름 "길이")와 같은 값을 가진 열의 숫자 열 ("LengthFloat")에 대한 값을 계산합니다.

alter table sometable add Value float; 
alter table sometable add Units varchar(15); 

Update sometable 
    set Value = SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 1), ' ', -1), 
     Units = SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 2), ' ', -1); 

update sometable 
    set LengthFloat = case Units 
     when 'yards' then Value*3 
     when 'yard' then Value*3 
     when 'feet' then Value 
     when 'foot' then Value 
    end; 

alter table sometable drop column Value; 
alter table sometable drop column Units; 

답변

0

코드는 그대로 두어야합니다.

다른보기 (보기 사용)를 설명하는 다른 제안 된 대답은 매우 비효율적이므로 거절해야합니다 (주석 참조).

0
drop view if exists sometable_with_value_units; 

create view   sometable_with_value_units as 
select id, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 1), ' ', -1) as value, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 2), ' ', -1) as units 
    from sometable; 

select id, 
     case units 
      when 'yards' then value * 3 
      when 'yard' then value * 3 
      when 'feet' then value 
      when 'foot' then value 
     end as feet 
    from sometable_with_value_units; 

http://sqlfiddle.com/#!9/ed7ca1/3

+0

테이블 업데이트를 업데이트하려고 할 때 오류가 발생합니다. –

+0

기본 테이블과 뷰 (무작위'unit's에서'value'를 합성하는 뷰)와 select (일관된'feet'을 합성하는)는 모두'id'를 제공합니다. 업데이트 할 때 선택 항목 'ON ID'로 기본 테이블을 조인하면됩니다. 더 나은, 피트 또는 미터와 같은 합리적인 기둥을 유지하십시오 (헛간이 아니라 면적 측정 용). 따라서 미친 중간 결과를 종합 할 필요가 없습니다. 그것을 새롭고 영구적 인 컬럼으로 만들거나 JOIN 할 수있는 부속 테이블에 넣으십시오. –

+0

나는 일하기 위해 합류했다. 어떤 이유로 이것은 매우 느리게 실행됩니다. 그것은 끝내지 않았고 그래서 나는 그것을 죽 였고, 그리고 나서 처음 1,000 개의 행만 달렸습니다. 그것은 65 초 걸렸다 (!!!). 작업 관리자를 살펴보면,이 시간 동안 CPU는 28 % (거의 모든 것이 mysql)이고, 메모리 사용량은 44 %이며, 디스크 사용량은 0 %에서 4 % 사이이며 일반적으로 0 %입니다. 나는 이미 자신의 우스운 값을 대체하기 위해 my.cfg를 최적화했기 때문에 12GB 램이 더 잘 활용된다. –

0

물론 그 길이 표정으로 주위 바이올린 할 수 있습니다 참조하십시오. 그러나 그것은 SQL에서 고통 스럽습니다. 대신 ...

나는 뒤로 물러서서 사용할 단위를 결정할 것입니다. 나는 아마도 미터법을 선택할 것이다. 예를 들어, 킬로미터가 아닌 모든 길이에 대해 "미터"를 선택할 수 있습니다. 옹스트롬이 아니라 발이 아니라 푹신 푹신한 것이지 축축한 것이 아니라 빛이 아닌 해입니다. (응용 프로그램이 천문학을 다뤘다면 좋을 것입니다.) 그런 다음 데이터베이스가 아닌 앱에서 전환을 수행합니다. 극한 상황을 제외하고는 열을 추가하거나 삭제하지 않을 것입니다.

+0

데이터가 들어오는 방식을 제어 할 수 없습니다. –

+0

다른 데이터베이스에서 직접 INSERT하는 중입니까? 아니면 앱에서 데이터를 받고 있습니까? 바라건대 후자. 일반적으로 데이터베이스에 삽입하기 전에 데이터를 정리하는 것이 좋습니다. –

+0

데이터베이스는 제 관점에서 본 것입니다. 데이터 마이닝을 위해 준비 중입니다. –