Oracle에서 테이블 열 정렬
50개 이상의 열이 있는 테이블이 있는데 처음 두 열의 순서를 바꾸어야 합니다.Oracle을 사용하여 이를 실현하는 가장 좋은 방법은 무엇입니까?테이블 이름이 ORDERDETAILES이고 현재 상태로는 처음 두 열은 ITEM_이라고 가정합니다.ID 및 ORDER_ID.이름 변경이 완료되면 테이블 이름은 ORDERDETAILES로 되어 있지만 처음 두 열은 ORDER_로 되어 있습니다.아이디와 아이템_ID. FWIW, 컬럼 유형 및 나머지 컬럼의 순서는 다음과 같습니다.
틀렸다면 정정해 주세요.하지만 일반적인 절차는 다음과 같습니다.
- 기존 테이블의 이름을 변경합니다.
- 프라이머리 키 구속조건을 드롭합니다.
- 올바른 열 순서를 사용하여 테이블을 다시 만듭니다.
- 목록 항목
- INSERT IN을 실행합니다.3단계에서 데이터를 온도에서 테이블로 이동하려면 선택합니다.
- 임시 테이블을 떨어뜨립니다.
Oracle에 대한 경험이 적기 때문에 한두 단계를 놓칠 수 있습니다.
프라이머리 키는 Oracle의 인덱스를 의미합니까?프라이머리 키를 드롭하면 인덱스가 드롭됩니까?
SQL의 예는 매우 감사합니다.
편집: 도움을 주는 것이 아니라 왜 그것이 필요한지에 대해 의문을 제기하는 사람들에게 진심으로 감사드립니다.필요한 이유에 대한 질문에 답하려면:저는 이렇게 해야 하고 열의 순서가 중요하다고 말하는 다른 사람의 명령을 따르고 있습니다.이에 대한 제 생각/의견은 변함이 없습니다.
Oracle 12c 릴리스 이후 열을 논리적으로 재배치하는 것이 쉬워졌습니다.
Oracle 12c는 열을 보이지 않게 하는 지원을 추가했으며 이 기능을 사용하여 열을 논리적으로 재배치할 수 있습니다.
보이지 않는 열을 표시하면 열이 표의 열 순서에 마지막 열로 포함됩니다.
예
테이블을 만듭니다.
CREATE TABLE t (
a INT,
b INT,
d INT,
e INT
);
열 추가:
ALTER TABLE t ADD (c INT);
열을 가운데로 이동합니다.
ALTER TABLE t MODIFY (d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (d VISIBLE, e VISIBLE);
DESCRIBE t;
Name
----
A
B
C
D
E
크레디트
저는 Oracle 12c의 신기능에 대한 Tom Kyte의 기사를 통해 이 사실을 알게 되었습니다.
DBMS_Redefinition 패키지를 확인합니다.새로운 오더로 테이블을 재구축합니다.온라인 테이블에서 할 수 있습니다.
Phil Brown이 지적했듯이, 이것을 하기 전에 신중하게 생각하세요.그러나 행에서 열을 검색하고 업데이트 시 데이터를 이동하는 데 오버헤드가 발생합니다.사용하는 열 순서 규칙(특정 순서 없음):
- 관련 열을 그룹화합니다.
- NULL 가능 열 앞에 NULL 열이 없습니다.
- 색인화되지 않은 열을 자주 먼저 검색했습니다.
- 거의 채워지지 않은 null-able 열이 마지막에 표시됩니다.
- 먼저 정적 열입니다.
- 나중에 varchar 열을 업데이트할 수 있습니다.
- 검색 가능한 다른 열 뒤에 인덱싱된 열입니다.
이러한 규칙은 경합하며 최신 릴리스에서 모두 성능을 테스트한 것은 아닙니다.대부분은 실제로 테스트를 거쳤지만 결과를 문서화하지는 않았습니다.배치 옵션은 세 가지 상충되는 목표 중 하나를 대상으로 합니다. 즉, 알기 쉬운 열 배치, 빠른 데이터 검색, 업데이트 시 데이터 이동 최소화입니다.
위의 Jonas의 솔루션을 따라가 보니 두 번째 열을 추가해야 할 때까지 잘 작동했습니다.여기서 알게 된 것은 열을 다시 표시할 때 Oracle이 반드시 스테이트먼트에 나열된 순서대로 표시할 필요는 없다는 것입니다.
이것을 증명하기 위해서는 위의 Jonas의 예를 따른다.표시된 바와 같이 단계가 완료되면 표는 예상한 순서대로 표시됩니다.다음에 나타내는 것처럼 다른 열을 추가하면 작업이 세분화됩니다.
예(Jonas에서 계속):
C열 앞에 삽입할 다른 열을 추가합니다.
ALTER TABLE t ADD (b2 INT);
위에서 설명한 기술을 사용하여 새로 추가된 B2 열을 C 열 앞으로 이동합니다.
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY (c VISIBLE, d VISIBLE, e VISIBLE);
DESCRIBE t;
Name
----
A
B
B2
D
E
C
위와 같이 C열이 끝으로 이동하였습니다.위의 ALTER TABLE 문에서는 문에서 지정된 순서(아마도 물리적 테이블 순서)가 아닌 D, E, C 순서로 열을 처리한 것으로 보입니다.열이 원하는 위치에 배치되도록 하려면 열을 원하는 순서대로 하나씩 표시해야 합니다.
ALTER TABLE t MODIFY (c INVISIBLE, d INVISIBLE, e INVISIBLE);
ALTER TABLE t MODIFY c VISIBLE;
ALTER TABLE t MODIFY d VISIBLE;
ALTER TABLE t MODIFY e VISIBLE;
DESCRIBE t;
Name
----
A
B
B2
C
D
E
Oracle이 이를 허용하지 않는 것은 슬픈 일이며, 개발자로부터 항상 이 작업을 요청받습니다.
다음은 약간 위험하고 빠르고 지저분한 방법입니다.
- 표를 복사할 수 있는 충분한 공간이 있는지 확인합니다.
- 제약, 인가, 색인, 동의어, 트리거 등을 적어 둡니다.아마 내가 미처 생각지 못한 다른 물건들-테이블에 속하지 않았을까?
CREATE TABLE table_right_columns AS SELECT column1 column3, column2 FROM table_wrong_columns; -- Notice how we correct the position of the columns :)
DROP TABLE table_wrong_columns;
- 'ALTER TABLE_right_columns RENAME TO table_wrong_columns;'
- 여기서 이상한 점은 위의 2단계에서 설명한 모든 항목을 다시 작성한다는 것입니다.
- 현재 유효하지 않은 코드를 확인하고 다시 컴파일하여 오류를 확인합니다.
그리고 다음 번에 테이블을 작성할 때는 향후 요건을 고려하시기 바랍니다.;)
CREATE VIEW CORFICTED_POSITION AS SELECT co1_1, col_3, col_2 FROM UNORDED_POSITION이 도움이 될 것입니다.
이 요청은 SELECT * FROM [ table _ name ]를 사용하는 곳에서 일부 보고서가 생성되도록 이루어집니다.또는 백엔드에서 읽기 쉽도록 정보를 배치하는 계층적 접근 방식을 사용하는 기업도 있습니다.
땡스 딜립
언급URL : https://stackoverflow.com/questions/4939735/re-order-columns-of-table-in-oracle
'programing' 카테고리의 다른 글
Oracle SQL에서 세미콜론과 슬래시를 사용해야 하는 경우 (0) | 2023.03.28 |
---|---|
Eclipse 프로젝트로 JSON 가져오기 (0) | 2023.03.28 |
정의되지 않은 함수 curl_version 호출 (0) | 2023.03.28 |
Java에서 JSON 문자열로 지정된 이름과 값을 찾으려면 어떻게 해야 합니까? (0) | 2023.03.28 |
ng-show(어레이 길이가 0일 경우) (0) | 2023.03.28 |