programing

Oracle에서는 테이블에 열을 "삽입"할 수 있습니까?

css3 2023. 10. 27. 22:05

Oracle에서는 테이블에 열을 "삽입"할 수 있습니까?

기존 테이블에 열을 추가할 때 Oracle은 항상 테이블 끝에 열을 둡니다.테이블에 표시해야 할 위치를 Oracle에게 알려줄 수 있습니까?만약 그렇다면, 어떻게?

테이블에서 열의 위치는 중요하지 않아야 합니다("페이지 크기"를 고려하거나 Oracle이 데이터를 실제로 저장하는 데 사용하는 방법이 없는 한).소비자에게 더 중요한 것은 결과를 어떻게 부르느냐, 즉 Select(선택) 문입니다.

YOUR_ORIGINAL_TABLE을 YOUR_NEW_TAB으로 이름 바꿉니다.LE;

테이블 생성 YOUR_ORIGINAL_TABLE nologging /* 또는 복구할 수 없음 */ YOUR_NEW_TAB에서 컬럼 1, 컬럼 2, NEW_COLUMN, 컬럼 3을 선택합니다.LE;

드롭 테이블 YOUR_NEW_TABLE;

* YOUR_ORIGINAL_TAB에서 선택LE; <<< 이제 테이블 중앙에 새 열이 표시됩니다.

그런데 왜 그러려고 하는 겁니까?비논리적으로 보입니다.열 순서가 중요한 경우에는 절대 열 순서를 가정하지 말고 명명된 열 목록만 사용하면 됩니다.

열의 순서가 중요한 이유는 무엇입니까?선택한 문장에서 언제든지 변경할 수 있습니까?

테이블 끝에 새 열을 추가할 수 있는 장점이 있습니다.만약 순진하게 "SELECT *"를 한 후에 필드를 순서대로 파싱하는 코드가 있다면, 당신은 마지막에 새로운 열을 추가함으로써 이전 코드를 깨지 않을 것입니다.표 가운데에 새 열을 추가하면 이전 코드가 끊어질 수 있습니다.

한 직장에서는 "절대 '선택*'을 하지 말라"는 DBA를 무척이나 좋아했습니다.그는 당신이 항상 특정한 분야를 쓰라고 주장했습니다.

제가 주로 하는 일은:

  1. 이전 테이블의 이름을 바꿉니다.
  2. 열이 올바른 순서로 있는 새 테이블을 만듭니다.
  3. 해당 새 테이블에 대한 제약 조건을 만듭니다.
  4. 데이터로 채우기:이름이 변경된 테이블에서 new_table에 *를 선택하여 삽입합니다.

데이터를 임시 테이블에 저장하고 테이블을 떨어뜨려 재생성하지 않으면 불가능하다고 생각합니다.반대로, 칼럼이 어디에 있는지는 정말 중요하지 않을 것입니다.선택 문에서 검색할 열을 지정하면 원하는 대로 순서를 지정할 수 있습니다.

표 아래에는 표 레코드의 모든 데이터가 서로 붙어 있습니다.테이블 끝에 열을 추가하는 것은 [Nullable이거나 (이후 버전에서는) 기본값으로 Null이 아닌 경우] 테이블의 메타데이터가 변경되었음을 의미합니다.가운데에 열을 추가하려면 해당 열에 대한 적절한 값(또는 마커)을 추가하려면 해당 테이블의 모든 레코드를 다시 작성해야 합니다.경우에 따라서는 레코드가 블록에서 더 많은 공간을 차지하고 일부 레코드는 마이그레이션해야 합니다.즉, 실제 크기의 테이블에 대한 막대한 IO 노력입니다.

원하는 순서로 열이 있는 테이블 위에 보기를 항상 작성할 수 있으며 테이블과 마찬가지로 DML 문에서 해당 보기를 사용할 수 있습니다.

저는 그렇게 생각하지 않습니다. SQL Server에서는 이러한 것들도 허용하지 않습니다.제가 항상 사용해야 하는 방법은 다음과 같습니다.

  1. 오른쪽으로 보이는 새 테이블 만들기(추가 열 포함)
  2. 거래시작
  3. 기존 테이블에서 새 테이블로 모든 데이터 선택
  4. 오래된 테이블 삭제
  5. 새 테이블 이름 바꾸기
  6. 커밋 트랜잭션.

정확하게는 아니지만, 일을 끝내게 됩니다.

아니요, "ALTER TABLE" 문을 통해서는 불가능합니다.그러나 이름은 다르지만 현재 정의와 동일한 정의를 사용하여 원하는 방식으로 열을 올바른 순서로 사용하여 새 테이블을 만들 수 있습니다.데이터를 새 테이블에 복사합니다.기존 테이블을 내려놓습니다.이전 테이블 이름과 일치하도록 새 테이블 이름을 바꿉니다.

Tom Kyte는 이것에 대한 기사를 AskTom 링크 텍스트에 가지고 있습니다.

'이후'란에 표시를 하는 것과 관련된 속임수가 있는 것 같습니다.INVISIBLE; 복원이 되면 결국 뒤쪽으로 가게 됩니다.

CREATE TABLE yourtable (one NUMBER(5, 0), two NUMBER(5, 0), three NUMBER(5, 0), four NUMBER(5, 0))
ALTER TABLE yourtable ADD twopointfive NUMBER(5, 0);
ALTER TABLE yourtable MODIFY (three INVISIBLE, four INVISIBLE);
ALTER TABLE yourtable MODIFY (three VISIBLE, four VISIBLE);

https://oracle-base.com/articles/12c/invisible-columns-12cr1#invisible-columns-and-column-ordering

1) 알겠습니다. 직접 하실 수는 없겠군요.같은 말을 한 후에 게시물이 필요한 건 아니죠?

2) 좋아요, 그럼 표의 열 순서는 기술적으로 중요하지 않습니다.하지만 그게 중요한 게 아니라, 원래 질문은 단지 당신이 할 수 있는지 없는지에 대한 것이었습니다.다른 사람들의 요구사항을 다 알고 있다고 생각하지 마세요.아마도 그들은 "*"를 100개의 열 이름으로 대체하는 것은 고사하고, 그들은 단지 "*"를 푸는 것을 원하지 않을 뿐만 아니라, 몇몇 기괴하게 함께 해킹된 쿼리 안에 "SELECT *..."를 사용하여 현재 쿼리되고 있는 100개의 열이 있는 테이블을 가지고 있을 것입니다.또는 SQL Developer와 함께 스키마를 탐색할 때 관련 필드가 서로 옆에 있는 것을 선호하기 때문일 수도 있습니다.어쩌면 논리적으로 볼 때 처음에 어딘가에 있어야 할 100개의 열 목록의 끝을 볼 줄 모르는 비기술 직원들을 상대하는 것일지도 모릅니다.

정직한 질문을 하고 "그렇게 해서는 안 된다"는 대답을 얻는 것보다 더 짜증나는 것은 없습니다.제 일이지 당신 일이 아닙니다! 제 일을 어떻게 해야 하는지 알려주지 마세요.할 수 있다면 도와주세요.감사합니다!

그래요... 불평해서 죄송합니다.이제... www.orafaq.com 에서 이 해결 방법을 제안합니다.

먼저 이미 실행했다고 가정합니다.

CREATE TAB1(col1 NUMBER );

이제 "col2"라는 이름의 열을 추가하고 싶지만 "SELECT * FROM tbl1;"을 수행할 때 "col2", "col1" 순서로 정렬되기를 원한다고 말합니다.

실행할 것을 제안합니다.

ALTER TABLE tab1 add (col2 date); tab1을 tab1_old로 이름 변경; tab1을 선택 0으로 col1로, col1을 col2로 tab1_old에서 col1로 생성;

저는 이것이 엄청나게 오해의 소지가 있다는 것을 알았습니다.우선, col1을 0으로 채우고 있으므로, 데이터가 있다면, 이렇게 함으로써 데이터를 잃는 것입니다.둘째로, 실제로 "col1"을 "col2"로 개명하고 있는데 이에 대해서는 언급하지 않고 있습니다.자, 여기 제 예가 있습니다. 조금 더 명확해졌으면 좋겠습니다.

다음 문으로 작성된 표가 있다고 가정합니다.

CREATE TABLE 사용자(first_name varchar(25), last_name varchar(25));

이제 first_name과 last_name 사이에 middle_name을 삽입하려고 합니다.한가지 방법이 있습니다.

ALTER TABLE 사용자 추가 middle_name varchar(25); 사용자 이름을 users_tmp로 변경; CREATE TABLE 사용자를 select first_name, middle_name, last_name from users_tmp; /* 및 적절한 조치를 위해...*/ DROP TABLE testusers_tmp;

middle_name은 기본적으로 NULL로 설정됩니다(ALTER TABLE 문에 의해 적용됨).CREATE TABLE 문에 다음과 같이 다른 기본값을 설정할 수도 있습니다.

CREATE TABLE 사용자 AS SELECT_name, '일부 기본값' AS middle_name, last_name FROM users_tmp;

이 방법은 sysdate 기본값으로 날짜 필드를 추가하는 경우 유용하지만, 기존 레코드 모두에 다른(예: 이전) 날짜 값이 포함되도록 하려면 유용합니다.

언급URL : https://stackoverflow.com/questions/578957/in-oracle-is-it-possible-to-insert-a-column-into-a-table