2010-12-09 5 views
15

FK가있는 오래된 테이블이 있습니다. 새 열을 추가하고 싶습니다. 이 새로운 열을 기본 키로 만들고 싶습니다. 그래서 나는 그 열을 첫 번째 열로 삽입하거나 내 테이블의 끝에 그것을 삽입하고 나중에 열을 다시 주문할 수 있다고 생각했습니다.SQL Server 열을 재정렬 할 수없는 이유는 무엇입니까?

하지만 SQL Server Management Studio에서는 허용하지 않았습니다. 나는 그것을 할 수 없다는 것을 이해하고, 그 열 순서는 SQL에서 거의 무관하다.

내가 알고 싶은 것은, 어찌하여 ... 나는 열을 떨어 뜨릴 수 있습니다 ... 새로운 것을 추가하는 것과 같은 것이 아닙니까?

나는 무엇이 진행되고 있는지 이해하려고 노력하고 있습니다. 나는 그것을 위해 문서를 찾는 데 어려움을 겪었다. 누구든지 좋은 방향으로 나를 가리킬 수 있다면.

SELECT (fields in DESIRED order) 
INTO MyNewTable 
FROM OldTable 
+1

사용중인 SQL Server의 버전과 얻은 정확한 오류 메시지를 알려주십시오. 테이블을 다시 만들어야하는 변경을 허용하지 않는 설정 일 수 있습니다. – Ryan

+0

늦어서 미안해, 크리스마스 일이 내 일을 늦췄다. MSSQL Server 2008 R2 (관리 스튜디오)를 사용하고 있습니다. 오류 메시지 : "변경 내용을 저장하는 것은 허용되지 않습니다. 변경 한 내용을 삭제하고 다시 만들어야합니다. 다시 만들거나 사용할 수없는 테이블을 변경했습니다 옵션 테이블을 다시 만들어야하는 변경 내용을 저장하지 못하게합니다. " –

+0

[테이블의 열을 논리적으로 재정렬 할 수 있습니까?] (http://stackoverflow.com/questions/1610/can-i-logically-reorder-columns-in-a-table) – bummi

답변

5

당신은 this question에 대한 답변에 관심이있을 수 있습니다

+4

컬럼 순서가 SQL 문의 컨텍스트에서 아무 값도 제공하지 않는다는 사실은 저에게 표준적인 것입니다 - 원하는 컬럼을 원하는 순서대로 선택하십시오. –

+0

동의. 나는 더 명확한 이유가있을 수도 있고 없을 수도 있음을 지적함으로써 나의 진술에 자격을 부여하려고 노력하고 있었다고 생각한다. 그러나 나는 하나가되어야한다고 생각하지 않는다는 것에 동의한다. –

+0

이것이 내가 가진 답에 대한 결론이라고 생각합니다. 고마워요! 논리적 인 필요가 없다면 SQL 작성자는 거의 쓸모없는 기능으로 이어지는 기능성을 포함하지 않을 것이라고 생각합니다. –

6

재 배열 열은 기본적으로 휴양을 필요로 변경을 사용할 경우 해결 방법입니다 테이블을 리메이크과 동일합니다.

에 대한 이유는 입니다 (게시 된 SSMS 관련 답변을 제외하고) 열을 재정렬 할 수는 없지만 SQL 표준에 프로그래밍 방식의 구문이 포함되어 있지 않은 것을 제외하고는 정답을 찾을 수 있을지 확신하지 못합니다. 따라서 테이블의 스키마 (열의 순서 포함)를 재정의하는 유일한 방법은 테이블을 삭제하고 다시 작성하는 것입니다. 따라서 열 "재정렬"을 제공하는 관리 응용 프로그램 (예 : 링크 된 질문에서 지적한 SSMS의 디자인보기)이 그이면에서 수행 될 가능성이 큽니다. 표준 DDL의 일환으로 열 재정렬 메커니즘을 제공하지 않는 명시 적 이유이 경우 SQL 사양의 깊은 지식을 가진

사람이 모순 수 있지만, 난 단지 추측 할 수있는, 그 쿼리는 순서를 정의하기 때문에 DBMS는 개별 구현에 따라 물리적 저장소를 제어합니다. 논리적 열 순서는 본질적으로 의미가 없으며 이러한 메커니즘을 보증하지 않습니다.

1

내 의심이 맞으면 테이블을 다시 만들어 저장해야하는 변경을 허용하려면 설정을 해제해야합니다.

열기 SQL 관리 Studio 및 도구 -로 이동 메뉴를 사용> 왼쪽에있는 옵션 메뉴에서 옵션

이 옵션은 오른쪽 창 표에서 디자이너

을 선택할 수 있도록 옆의 확인란이 "테이블 재 작성이 필요한 변경 사항 저장 금지"설정이 선택 취소되었습니다.

확인을 마친 후 다시 열 순서를 변경하십시오.

+0

실제로 작동했습니다. 이제는 안전한지, 그리고 왜 우리가 테이블을 다시 만들지 않고도 이것을 할 수 없는지를 알아야합니다. 감사합니다 –

22

확실히 할 수 있습니다. SQL Server Management Studio에서이 옵션의 선택을 해제하십시오.
도구> 옵션> 디자이너> 테이블 레크레이션이 필요한 변경 내용 저장 금지. 내가 알고 싶은 무엇

Options dialog

+7

바라건대 그 불필요한 말을하지만, 어쨌든 그것을 말하십시오. 이것은 테이블을 죽일 수 있습니다. 프로덕션 데이터베이스와 가까운 곳으로 가면 변경 작업을 마친 후 해당 플래그를 다시 켜는 것이 좋습니다! – Robb

+0

전적으로 큰 테이블의 경우 정말 해로울 수 있습니다. –

+0

내 문제가 해결되었습니다. 테이블의 속성에서이 옵션을 찾고있었습니다. 현재 테이블에는 언어 테이블에 66 개의 행과 1 개의 FK가 있습니다. 내 물건이 부서 지는지 한번 시험해 볼게. 감사!! –

0

는 ... 올 ... 내 말은, 나는 열을 삭제하는 방법되지입니다 새로 추가하는 것과 같은 일?

열 삭제는 서수 위치 (첫 번째/두 번째/세 번째/기타 열)가 아닌 열 이름을 기반으로합니다. 열 추가는 항상 열 목록 끝에 추가됩니다. 이것은 열 순서가 SQL 조작 이외의 데이터와 완전히 관련이 없음을 강조합니다. 나는 둘 중 어떤 것이 유사한 것으로 보는지 모르겠다. ...

SQL 데이터베이스 없음 특정 순서로 열을 기존 테이블에 삽입하는 것을 지원합니다. PHPMyAdmin은 기능을 제공했으나이 기능을 사용하여 원하는 열 순서가있는 새 테이블을 만들고 이전 테이블의 데이터를 복사 한 다음 이전 테이블을 삭제/삭제하는 기능이 있습니다.

열 순서는 운영에 더 이익을 ... 당신은 테이블에 데이터가없고하지 않는 한 생산에없는 것을하고 싶지 않아

+5

* * 약간 OCD 개발자에게 이점을 제공합니다 ...;) –

+0

@djacobson : OCD 요구 사항을 지닌 DBA를 지원해야했습니다. 시간, 비용 및 리소스 낭비입니다. 더 많은 정보를 변경할수록 더 많은 정보가 잘못 될 수 있습니다. –

+0

우퍼. 운이 없었어. 귀하의 솔루션은 스크립트 생성기를 작성하여 해당 테이블에 대해 새로운 CREATE TABLE 문을 원하는 순서로 나열하고 관련 drop-table 및 copy-data 문과 함께 데이터베이스를 실행합니다 ? :) –

0

을 제공하지 않습니다! 그 이유는 기존 레코드를 임시 테이블로 가져와 이전 테이블을 삭제하고 임시 테이블의 이름을 바꾸어야하기 때문입니다. 이것은 프로덕션의 기존 테이블을 수행하는 것은 매우 나쁜 일입니다. 어쨌든 쿼리에서 열 순서에 의존하는 것은 어리 석습니다. 따라서 이것은 완전히 불필요한 작업입니다. 문자 그대로 아무런 이득이없는 큰 고통을 초래할 수있는 것입니다. 해결 방법을 찾더라도이 길을 내려 가지 마십시오.

+0

안녕하세요 HLGEM, 내 게시물을주의 깊게 읽으십시오.이 작업을 정말로하고 싶지는 않습니다. 정말로 원하는 것은 누군가가이 작업을 수행 할 수없는 이유를 아는 것입니다. 그러나 hehe 비록 경고를 주셔서 감사합니다 :) –

+0

당신은 테이블을 만들고 그것에 데이터를 이동하여 그것을 할 수 있습니다. 그렇기 때문에 기존 데이터베이스 액세스에 엄청난 문제가 발생할 수 있기 때문에 일반적으로 허용되지 않는 이유가 있습니다. – HLGEM

관련 문제