2014-05-19 3 views
1

MySQL 데이터베이스에서 다른 테이블에 두 개의 열 외래 키 인 concept을 통합하는 새로운 closure 테이블 (closure_new)을 만들어야합니다. 즉 closure_newclosure이 아닌 행을 추가하는 것입니다. 어떻게 이것을 달성하기 위해 SQL을 설정합니까? 내 첫 번째 시도는 subtypeId/subtype_effectiveTime를 해결하고 완전히 해결하지 않을 수 있습니다동일한 테이블의 두 개의 복합 키

INSERT INTO `closure_new` 
SELECT o.subtypeId, d.id, d.effectiveTime 
    FROM concept d 
    JOIN closure o 
    ON o.subtypeId = d.id; 

참고 :

여기 closure_new을 채우는 코드에서 내 첫 번째 시도이다. SQL은 또한 supertypeId/supertype_effectiveTime을 통합해야합니다. 어떻게 각 subtypeIdsupertypeId와 관련된 effectiveTime 값을 각각 기록과 closure_new 테이블을 채울 수있는 SQL을 작성하려면 어떻게해야합니까?

다음
CREATE TABLE `closure` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `subtypeId` BIGINT(20) NOT NULL , 
    `supertypeId` BIGINT(20) NOT NULL , 
    PRIMARY KEY (`id`) 
); 

내가 위 쓰기 시작 스크립트로 채워해야하는 closure_new 테이블 : 여기

CREATE TABLE `concept` (
`id` BIGINT NOT NULL DEFAULT 0, 
`effectiveTime` VARCHAR(8) NOT NULL DEFAULT '', 
`some other fields`, 
PRIMARY KEY (`id`,`effectiveTime`) 
) ENGINE=InnoDB; 

이전 closure 테이블 : 여기

concept 테이블 :

CREATE TABLE `closure_new` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`subtypeId` BIGINT(20) NOT NULL , 
`subtype_effectiveTime` VARCHAR(8) NOT NULL DEFAULT '', 
`supertypeId` BIGINT(20) NOT NULL , 
`supertype_effectiveTime` VARCHAR(8) NOT NULL DEFAULT '', 
FOREIGN KEY (`supertypeId`, `supertype_effectiveTime`) references concept(`id`, `effectiveTime`), 
FOREIGN KEY (`subtypeId`, `subtype_effectiveTime`) references concept(`id`, `effectiveTime`) 
); ENGINE=InnoDB; 

답변

1

확실하지 발행해야하지만 방법에 대한 :

INSERT INTO `closure_new` (subtypeId, subtype_effectiveTime, supertypeId, supertype_effectiveTime) 
SELECT subCon.id, subCon.effectiveTime, superCon.id, superCOn.effectiveTimed.effectiveTime 
    FROM closure o, concept subCon, concept superCon 
where subcon.Id = o.subtypeId and supercon.Id = o.supertypeId 
가능

또는, 그 select 문과 함께 create view 수 있습니다.

+0

도와 주셔서 감사합니다. 다른 응답자의 코드를 실행하고 MySQL 명령 행 클라이언트를 종료하고 시스템을 재부팅하여 중지 시키려면 7 천만 개가 넘는 행을 새 테이블에 추가했습니다. 그 결과 윈도우는 더 이상 MySQL 윈도우 서비스를 시작하지 않을 것이고, 윈도우 서비스가 다시 시작될 때까지 내 개발 프로젝트를 종료합니다. 나는 이것을 또 다른 질문으로 올렸다. 기꺼이 도와 줄 수있어? 여기에 링크가 있습니다 : http://stackoverflow.com/questions/23816585/drop-table-in-mysql-from-outside – CodeMed

+0

Crikey! 일단 서버를 다시 시작했다면 위의 방법을 시도해 보시기 바랍니다. 그러나 전체'Insert' 명령을 실행하기 전에, Select 절이'select count (*)'로 시도해 어떤 일이 일어나는지보십시오. – Chrisky

+0

위의 코드를 실행하여 31 분 안에 예상되는 수의 새 행을 만들었습니다. 나는 이것을 대답으로 표시하고있다. 고맙습니다. +1. – CodeMed

2

시험해보기 :

insert into closure_new 
(subtypeId, subtype_effectiveTime, supertypeId, supertype_effectiveTime) 
select cl.id, co.effectiveTime, co.id, co.effectiveTime from closure cl inner join concept co 

귀하의 데이터 더 적합 또는 당신은 내가 완전히 필요하시면 이해하는 경우 일부 외래 키 제약 조건이

+0

난 당신의 데이터가 어떻게 생겼는지 모르겠지만 아마 당신은 다음'왼쪽 외부 join'을 찾고? – karlipoppins

+0

이 코드가 내 데이터베이스를 손상 시켰습니다. 삽입 명령문이 24 시간 이상 실행되었고 유효하지 않은 데이터 260GB를 새 테이블에 삽입했습니다. MySQL 커맨드 라인 클라이언트를 죽이고 컴퓨터를 다시 시작하여 스크립트를 강제로 중지해야했습니다. 나는 그때 생성 된 260 GB 테이블을 삭제하기 위해 손상되지 않은 윈도우 MySQL 서비스를 시작하기 전에 각각 24 시간이 걸린 MySQL 덤프 및 복원 작업을 실행하는 데 2 ​​일을 소비해야했습니다. 이 3 가지 작업만으로 총 72 시간이 걸렸습니다. 대조적으로 다른 응답자의 코드는 31 분 만에 실행되었습니다. – CodeMed

+0

hmmm 내 쿼리가 불완전하고 끝 부분이 누락되었습니다. 아마도 잘못된 복사/붙여 넣기를 SQL 창에서. 나는 그것이 당신의 데이터를 손상시킬 수 있다고 생각하지 못했다 ...하지만 나는 여기에 그것을 붙여 넣기 전에 그것을 테스트 해 보았 기 때문에 나는 그것이 효과적 일 것이라고 확신한다. – karlipoppins