2013-03-29 3 views
3

두 파일을 서로 맞추는 방법을 배우려하고 있습니다. 하지만 지금은 5 시간 동안 모든 노력을하고 있습니다 ... 그리고 아직도해야할 일이 전혀 없습니다.기본 키를 세 열로 만들 수있는 방법

Postal, Number, Houseletter, livingspace 

두 번째 파일 (7.000 행) 포함 4 열 :

Postal, Number, Houseletter, Furniturevalue 

내 첫 번째 파일에서 나는 모든 livingspaces에서이

첫 번째 파일 (600.000 행) 4 열을 포함 큰 영역과 내 두 번째 파일에서 그 큰 영역에서 몇 가지 adresses의 Furniturevalue 있습니다.

나는

1. 그래서 데이터베이스에 파일을 가져온 파일에서 내 두 번째 파일에 adresses에 livingspaces을 추가 할 수 있습니다. 열 때 우편 + 수 + Houseletter,하지만 떨어져에만 고유하기 때문에,

Primary key --> Postal, Number, Houseletter 

을하지만이 작동하지 않습니다

Table first file -> Space 
Table second file -> Furniture 

지금 나는 테이블에 기본 키를 만들려고 해요 서로에게서.

누구나 다음 단계를 알고 있습니까? 나는이 쿼리를 작동하게하려면 어떻게해야합니까 무엇 :

SELECT postal, number, houseletter, furniturevalue, livingspace 
FROM space, furniture 
WHERE (space.postal = furniture.postal 
AND  space.number = furniture.number 
AND  space.houseletter = furniture.houseletter) 

임이 쿼리에`우편, 숫자, houseletter, furniturevalue, LIVINGSPACE '두 테이블에서 그래서 데이터를 새로운 뷰를 만들려고 노력. 하지만 먼저 기본 키 문제를 해결할 솔루션이 필요합니다.

도움 주셔서 감사합니다.

PS : 임에 phpMyAdmin에서 SQL을 사용하여

+0

'기본 키 -> 우편 번호, 집행관'이란 무슨 뜻입니까? 세 개의 기본 키 또는 구성된 기본 키를 세 개의 열을 사용하여 만들려고 했습니까? –

+0

복합 기본 키를 만들었습니까? SQL을 실행할 때 오류가 발생합니까? –

+0

당신이하고있는 일이 '모범 사례'의 반대라는 것을 알아야합니다. –

답변

8
ALTER TABLE space ADD PRIMARY KEY(Postal, Number, Houseletter); 

:

ALTER TABLE space DROP PRIMARY KEY, ADD PRIMARY KEY(Postal, Number, Houseletter); 

중복 PK와있어 경우 시도해 볼 수 있습니다 :

ALTER IGNORE TABLE space ADD UNIQUE INDEX idx_name (Postal, Number, Houseletter); 

이렇게하면 모든 중복 행이 삭제됩니다. 추가 된 이점으로, 향후 INSERT가 중복되면 오류가 발생합니다. 항상 그렇듯이,이

두 번째 질문 같은 것을 실행하기 전에 백업을 수행 할 수 있습니다, 쿼리는 다음과 같이한다 : 당신은 (postal, number, houseletter) 조합마다 고유 행을 만들 group by을 사용할 수 있습니다

SELECT postal, number, houseletter, furniturevalue, livingspace 
FROM space INNER JOIN furniture 
ON (space.postal = furniture.postal 
AND  space.number = furniture.number 
AND  space.houseletter = furniture.houseletter) 
+0

! 나는 첫 번째 쿼리를했는데 일부 행이 두 배가된다는 오류가 발생했습니다. 그러나 두 행을 삭제하는 것을 알고 있습니까? – warnerst

+0

@warnerst : 수정 된 답변. 확인해주세요 –

+0

고맙습니다. 시도해 보겠습니다. – warnerst

0
ALTER TABLE <TableName> 
ADD CONSTRAINT <constraintName> PRIMARY KEY (colA, colB, ..., colN) 
기본 키 이미 다음은이 작업을 수행 할 수있는 경우
0

. 집계는 해당 그룹에 대해 livingspace의 값을 계산합니다. 이 예는 max() 집계로 가장 높은 livingspace을 선택합니다 :이 같은

select coalesce(space.postal, furniture.postal) as postal 
,  coalesce(space.number, furniture.number) as number 
,  coalesce(space.houseletter, furniture.houseletter) as houseletter 
,  max(furniture.furniturevalue) as furniturevalue 
,  max(space.livingspace) as livingspace 
from space 
full outer join 
     furniture 
on  space.postal = furniture.postal 
     and space.number = furniture.number 
     and space.houseletter = furniture.houseletter 
group by 
     coalesce(space.postal, furniture.postal) 
,  coalesce(space.number, furniture.number) 
,  coalesce(space.houseletter, furniture.houseletter) 
+0

감사합니다. 나는 너에게 알려주 려 할 것이다! – warnerst

+0

기본 키를 추가 할 때 다음과 같이 나타납니다. # 1062 - 'Adres_index'키에 중복 항목 '1391BR-19-' – warnerst

0

뭔가 작동 할 수 있습니다.concat()을 사용하여 열을 결합 할 수 있습니다.

select (concat(s.Postal,' ',s.Number,' ',s.Houseletter)) as s.address,(concat(f.Postal,' ',f.Number,' ',f.Houseletter)) as f.address,s.*,f.* from space s,furniture f where s.address=f.address; 
관련 문제