2011-01-02 3 views
11

우리는 제품이 발전함에 따라 때때로 새로운 필드를 추가하는 MySQL 테이블을 사용합니다. 내가 가져 오는 테이블의 내용을 지우지 않고 데이터베이스의 복사본 하나에서 다른 테이블로 테이블의 구조를 내보내는 방법을 찾고 있습니다.업데이트 된 구조를 현재 테이블의 내용을 잃지 않고 MySQL 테이블로 가져올 수 있습니까?

예를 들어 테이블의 사본 A와 B가 있고 테이블 A에 X, Y, Z 필드를 추가한다고 가정합니다. 변경된 구조 (필드 X, Y, Z)를 테이블 B에 복사하는 방법이 있습니까 내용을 그대로 유지하면서?

mysqldump를 사용해 보았지만 이전 내용보다 우선하는 내용으로 전체 테이블을 복사 할 수 있거나 "-d"플래그를 사용하여 데이터를 복사하는 것을 피할 수 있습니다 (구조 만 덤프). 가져 오면 빈 테이블이 만들어져 이전 데이터를 다시 덮어 씁니다.

내가 mysqldump 또는 다른 도구를 사용하여 수행 할 수있는 방법이 있습니까?

답변

3

일반적으로 나는 각각의 ALTER TABLE 문을 개발 테이블에서 실행하고 필요한 경우 언제든지 대상 테이블에 적용합니다.

(구조 비교 도구와 같은)이를 수행하는 좀 더 정교한 방법이 있지만이 방법이 효과적이라는 것을 알았습니다. 수동으로 단계별로이 작업을 수행하면 필드의 유형이나 최대 길이를 변경하는 구조적 변경으로 인해 데이터가 우발적으로 변경되거나 파괴되는 것을 방지 할 수 있습니다. 귀하의 경우에 대한

+1

자동 스크립트로 어떻게 만들 수 있습니까? –

+0

@Jack 어떤 플랫폼을 사용하여 "자동 스크립트"가 정확히 무엇을 의미합니까? –

+1

MySql을 사용합니다. 프로덕션에서 데이터를 겹쳐 쓰지 않고 개발에서 구조 변경 만 적용하지 않고 개발시 구조를 덤프 한 다음 프로덕션으로 가져 오는 일반 스크립트. –

0

, 그냥 업데이 트

alter table B add column x varchar(255); 
alter table B add column y varchar(255); 
alter table B add column z varchar(255); 

update A,B 
set 
    B.x=A.x, 
    B.y=A.y, 
    B.z=A.z 
where A.id=B.id; <-- a key that exist on both tables 
0

이 일을 편리한 방법이 있습니다를 수행해야하지만, 텍스트 편집기에서 약간의 편집이 필요할 수 있습니다 :이의 gedit에서 최대 10 분 정도 걸립니다 을 리눅스에서 !!


당신이 그것을 저장 테이블 &에 수출 : localTable.sql

텍스트 edior (gedit를)에서 열기 당신은이 같은 표시됩니다 후

CREATE TABLE IF NOT EXISTS `localTable` (
    `id` int(8) NOT NULL AUTO_INCREMENT, 
    `date` int(10) NOT NULL, 
    # Lot more Fields ..... 
    #Other Fields Here 

을 그냥 제거 :

  • 종료 후 무엇이든) 괄호 자체
  • NOT이 localTable (
  • 변경 모든 ,에있는 경우 테이블 만들기; 이 모든 것을 한 번 실행하는 것과 같은 각 행의
  • 모든 ADDPRIMARY KEY (id)를 제거하고 ADDKEY created_by (created_by)!
  • 그리고 당신이

    `id` int(8) NOT NULL AUTO_INCREMENT, 
        `date` int(10) NOT NULL, 
        # Lot more Fields ..... 
        #Other Fields Here 
    

    각 줄의 시작에 추가이 ALTER 테이블 localTable 그거야 그

    ALTER TABLE `localTable` ADD `id` int(8) NOT NULL AUTO_INCREMENT, 
    ALTER TABLE `localTable` ADD `date` int(10) NOT NULL, 
        ALTER TABLE `localTable` ADD #to each more Fields ..... 
        #Other Fields Here 
    

    ADD가있을 것이다 당신이

에 관심이 필드를 유지 이 작업을 수행하기위한 쉘 스크립트를 추가하여 자동화 된 스크립트를 만들 수 있습니다. 당신이 'remoteTable'에서 가져 오기를 할 필요가 무엇인지 후

)

감사

0

난 그냥 같은 문제를 가지고 있으며이 방법으로 해결 :

수출 구조를 갱신하는 테이블 개발 테이블의 구조를 내 보냅니다.

첫 번째 파일에 대해이 코드를 실행하면 내 보낸 파일 이름에 따라 "update.sql"을 변경해야합니다.

cat update.sql|awk -F/'{ 
if(match($0, "CREATE TABLE")) { 
    { FS = "`" } ; table = $2 
} else { 
    if(match($0," `")) { 
    gsub(",",";",$0) 
    print "ALTER TABLE `" table "` ADD" $0 
    } 
} 
}' > update_alter.sql 

실행 두 번째 파일

cat development.sql|awk -F/'{ 
if(match($0, "CREATE TABLE")) { 
    { FS = "`" } ; table = $2 
} else { 
    if(match($0," `")) { 
    gsub(",",";",$0) 
    print "ALTER TABLE `" table "` ADD" $0 
    } 
} 
}' > development_alter.sql 

지금 실행이있을 것이다 update_db.sql하여 출력 파일의 차이 파일에서

diff --changed-group-format='%<' --unchanged-group-format='' development_alter.sql update_alter.sql > update_db.sql 

을 찾기 위해이 명령에 대한 동일한 명령 당신이 찾고있는 코드.

0

아니요. MySql에서 mariaDB 버전을 사용하고 있기 때문에 불가능합니다. 테이블의 mariaDB 버전 구조는 메모리에 정렬되고 그 메모리는 바이트 데이터와 공유됩니다. 구조체 (또는 테이블)를 가져 오려고하면 전체 메모리 블록이 변경됩니다.

관련 문제