developer tip

PostgreSQL에서 부호없는 정수를 사용할 수없는 이유는 무엇입니까?

optionbox 2020. 8. 27. 07:43
반응형

PostgreSQL에서 부호없는 정수를 사용할 수없는 이유는 무엇입니까?


이 게시물 ( MySQL에서 tinyint, smallint, mediumint, bigint 및 int의 차이점은 무엇입니까? )을보고 PostgreSQL이 부호없는 정수를 지원하지 않는다는 것을 깨달았습니다.

누구든지 그 이유를 설명하는 데 도움을 줄 수 있습니까?

대부분의 경우 MySQL에서 자동 증분 기본 키로 부호없는 정수를 사용합니다. 이러한 디자인에서 MySQL에서 PostgreSQL로 데이터베이스를 이식 할 때 어떻게 극복 할 수 있습니까?

감사.


postgresql에 서명되지 않은 유형이없는 이유는 이미 답변되어 있습니다. 그러나 서명되지 않은 유형에는 도메인을 사용하는 것이 좋습니다.

http://www.postgresql.org/docs/9.4/static/sql-createdomain.html

 CREATE DOMAIN name [ AS ] data_type
    [ COLLATE collation ]
    [ DEFAULT expression ]
    [ constraint [ ... ] ]
 where constraint is:
 [ CONSTRAINT constraint_name ]
 { NOT NULL | NULL | CHECK (expression) }

도메인은 유형과 비슷하지만 추가 제약이 있습니다.

구체적인 예를 들어 다음을 사용할 수 있습니다.

CREATE DOMAIN uint2 AS int4
   CHECK(VALUE >= 0 AND VALUE < 65536);

다음은 유형을 남용하려고 할 때 psql이 제공하는 것입니다.

DS1 = # 선택 (346346 :: uint2);

오류 : uint2 도메인의 값이 "uint2_check"검사 제약 조건을 위반합니다.


SQL 표준이 아니므로이를 구현하려는 일반적인 충동은 낮습니다.

다른 정수 유형이 너무 많으면 유형 확인 시스템이 더 취약 해 지므로 혼합에 더 많은 유형을 추가하는 데 약간의 저항이 있습니다.

즉, 할 수없는 이유가 없습니다. 그것은 단지 많은 일입니다.


CHECK 제약 조건을 사용할 수 있습니다. 예 :

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

또한 PostgreSQL에는 자동 증가를위한 serialbigserial유형이 있습니다.


Postgres에는 많은 사람들에게 알려지지 않은 부호없는 정수 유형이 OID있습니다.

oid유형은 현재 부호없는 4 바이트 정수로 구현됩니다. […]

oid유형 자체는 비교를 제외하고는 몇가지 연산을. 그러나 정수로 캐스트 한 다음 표준 정수 연산자를 사용하여 조작 할 수 있습니다. (이 작업을 수행하는 경우 서명 된 대 서명되지 않은 혼동 가능성에주의하십시오.)

그러나 숫자 유형 이 아니며 산술 (또는 비트 단위 연산)을 수행하려는 시도는 실패 할 것입니다. 또한 4 바이트 ( INTEGER)에 해당하는 8 바이트 ( BIGINT) 부호없는 유형 이 없습니다 .

따라서 이것을 직접 사용하는 것은 좋은 생각이 아니며 Postgresql 데이터베이스 디자인에서 직렬 기본 키에 대해 항상 INTEGER또는 BIGINT열을 사용해야한다는 다른 모든 답변에 동의합니다 .-음수 ( )로 시작 하거나 허용 전체 도메인을 소진하려면 ( ) 을 감싸십시오 .MINVALUECYCLE

그러나 다른 DBMS에서 마이그레이션하는 것과 같이 입력 / 출력 변환에 매우 유용합니다. 2147483648정수 열에 삽입하면 " 오류 : 정수 범위를 벗어남 "이 발생하지만 표현식을 사용하면 2147483648::OID잘 작동합니다.
마찬가지로를 사용하여 정수 열을 텍스트로 선택하면 mycolumn::TEXT어느 시점에서 음수 값을 얻지 만 mycolumn::OID::TEXT항상 자연수를 얻습니다.

dbfiddle.uk에서 예제를 참조하십시오 .


According to the latest documentation, the singed integer is supported but no unsigned integer in the table. However, the serial type is kind of similar to unsigned except it starts from 1 not from zero. But the upper limit is the same as singed. So the system truly does not have unsigned support. As pointed out by Peter, the door is open to implement the unsigned version. The code may have to be updated a lot, just too much work from my experience working with C programming.

https://www.postgresql.org/docs/10/datatype-numeric.html

integer     4 bytes     typical choice for integer  -2147483648 to +2147483647
serial  4 bytes     autoincrementing integer    1 to 2147483647

참고URL : https://stackoverflow.com/questions/20810134/why-unsigned-integer-is-not-available-in-postgresql

반응형