programing

Postgresql - 막대형 열의 크기를 더 작은 길이로 변경합니다.

elecom 2023. 5. 13. 08:49
반응형

Postgresql - 막대형 열의 크기를 더 작은 길이로 변경합니다.

다▁about에 대해 이 있습니다.ALTER TABLE명령어를 사용할 수 있습니다(3천만 행 이상).의 열 중 는 열중하는입니다.varchar(255)그리고 크기를 조정하고 싶습니다.varchar(40)기본적으로 다음 명령을 실행하여 열을 변경합니다.

ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);

, 제 더 수 것 .ALTER TABLE요?더 현명한 방법이 있습니까?새 열을 추가하고, 이전 열에서 값을 복사하고, 이전 열을 삭제하고, 마지막으로 새 열의 이름을 변경할 수 있습니까?

참고: Postgre를 사용합니다.SQL 9.0.

포스트그레에서SQL 9.1 더 쉬운 방법이 있습니다.

http://www.postgresql.org/message-id/162867790801110710g3c686010qcdd852e721e7a559 @mail.gmail.com

CREATE TABLE foog(a varchar(10));

ALTER TABLE foog ALTER COLUMN a TYPE varchar(30);

postgres=# \d foog

 Table "public.foog"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 a      | character varying(30) |

Postgre의 크기 조정에서 이 작업을 수행하는 방법에 대한 설명이 있습니다.데이터를 변경하지 않는 SQL 테이블입니다.당신은 데이터베이스 카탈로그 데이터를 해킹해야 합니다.이를 공식적으로 수행할 수 있는 유일한 방법은 ALTER TABLE을 사용하는 것이며, 앞서 언급한 바와 같이 변경사항은 실행 중에 전체 테이블을 잠그고 다시 작성합니다.

문서를 변경하기 전에 문서의 문자 유형 섹션을 읽으십시오.여기서 알아야 할 모든 종류의 이상한 사건들.길이 검사는 값이 행에 저장될 때 수행됩니다.그 안에서 하한선을 해킹해도 기존 값의 크기가 전혀 줄어들지 않습니다.변경 후 필드 길이가 40자 이상인 행을 찾기 위해 전체 테이블을 스캔하는 것이 좋습니다.이러한 행을 수동으로 잘라내는 방법을 알아내야 합니다. 따라서 크기가 큰 행에 대한 잠금을 몇 개만 다시 설정할 수 있습니다. 누군가가 해당 행의 내용을 업데이트하려고 하면 해당 행의 새 버전을 저장하는 시점에서 해당 행이 너무 큰 것으로 거부되기 때문입니다.사용자에게 즐거움이 뒤따릅니다.

VARCHAR는 Postgre에 존재하는 끔찍한 유형입니다.SQL은 SQL 표준의 관련된 끔찍한 부분만 준수합니다.다중 데이터베이스 호환성에 관심이 없는 경우 데이터를 TEXT로 저장하고 데이터 길이를 제한하는 제약 조건을 추가하십시오.이러한 테이블 잠금/재쓰기 문제 없이 변경할 수 있는 제약 조건은 약한 길이 검사보다 더 많은 무결성 검사를 수행할 수 있습니다.

좋아요, 파티에 늦었겠지만...

이 경우 열 크기를 조정할 필요가 없습니다!

일부 다른 데이터베이스와 달리 Postgres는 문자열에 맞는 충분한 공간만 사용할 수 있을 정도로 똑똑하므로(더 긴 문자열에 압축을 사용하더라도), 열이 VARCHAR(255)로 선언되더라도 40자 문자열을 열에 저장하면 공간 사용량은 40바이트 + 1바이트 오버헤드가 됩니다.

짧은 문자열(최대 126바이트)에 대한 저장 요구 사항은 1바이트에 실제 문자열(문자의 경우 공백 채우기 포함)을 더한 것입니다.긴 문자열의 오버헤드는 1이 아니라 4바이트입니다. 긴 문자열은 시스템에 의해 자동으로 압축되므로 Disk의 물리적 요구 사항이 더 적을 수 있습니다.또한 매우 긴 값은 더 짧은 열 값에 대한 신속한 액세스를 방해하지 않도록 백그라운드 테이블에 저장됩니다.

(http://www.postgresql.org/docs/9.0/interactive/datatype-character.html)

VARCHAR의 크기 규격은 삽입된 값의 크기를 확인하는 데만 사용되며 디스크 레이아웃에는 영향을 주지 않습니다.실제로 VARCHAR TEXT 필드는 Postgres에서 동일한 방식으로 저장됩니다.

때 VARCHAR 32에서 8로 자를 때 했습니다.ERROR: value too long for type character varying(8)저는해야 할 도 있는 제작 와 같은 하고 있기 한 한 지내고 (Postgre 에 DBMS 전해환수야자할고같와은때에근한싶한하객가능다고접니습에있작문기사고하용를체구로조제는의있도라른다post▁ipost▁as▁as▁that▁i에▁sql▁to'gre▁stay▁togre▁want).SQL이 기본값입니다.따라서 시스템 테이블을 변경하는 속임수를 사용하고 싶지 않습니다.

사용을 종료했습니다.USING에 있는 .ALTER TABLE:

ALTER TABLE "MY_TABLE" ALTER COLUMN "MyColumn" TYPE varchar(8)
USING substr("MyColumn", 1, 8)

@가 언급했듯이, @raylu ,,ALTER테이블에 대한 배타적 잠금을 획득하여 다른 모든 작업이 완료될 때까지 지연됩니다.

변경 사항을 트랜잭션에 적용할 경우 테이블이 잠기지 않아야 합니다.

BEGIN;
  ALTER TABLE "public"."mytable" ALTER COLUMN "mycolumn" TYPE varchar(40);
COMMIT;

400,000개 이상의 줄이 있는 테이블에서 몇 초 동안 빠르게 작동했습니다.

새 열을 추가하고 새 열을 이전 작업으로 교체하는 것은 Redshift postgresql에서 이 링크를 참조하십시오. 자세한 내용은 https://gist.github.com/mmasashi/7107430 .

BEGIN;
LOCK users;
ALTER TABLE users ADD COLUMN name_new varchar(512) DEFAULT NULL;
UPDATE users SET name_new = name;
ALTER TABLE users DROP name;
ALTER TABLE users RENAME name_new TO name;
END;

여기 그렉 스미스가 설명한 페이지의 캐시가 있습니다.이 경우에도 다음과 같이 변경할 수 있습니다.

UPDATE pg_attribute SET atttypmod = 35+4
WHERE attrelid = 'TABLE1'::regclass
AND attname = 'COL1';

표가 TABLE1인 경우 열은 COL1이고 35자로 설정하려고 합니다(+4는 링크에 따라 레거시 목적으로 필요하며, 코멘트에서 A.H.가 참조한 오버헤드일 수 있습니다).

다음 대체 테이블을 실행해 보십시오.

ALTER TABLE public.users 
ALTER COLUMN "password" TYPE varchar(300) 
USING "password"::varchar;

"import javax.constraint.constraints"의 일부인 주석 @Size(min = 1, max = 50), 즉 "import javax.constraint.constraints"의 매우 쉬운 크기 변경 방법을 찾았습니다.크기;"

@Size(min = 1, max = 50)
private String country;


when executing  this is hibernate you get in pgAdmin III 


CREATE TABLE address
(
.....
  country character varying(50),

.....

)

언급URL : https://stackoverflow.com/questions/7729287/postgresql-change-the-size-of-a-varchar-column-to-lower-length

반응형