web-dev-qa-db-ja.com

PostgreSQLで符号なし整数が使用できないのはなぜですか?

私はこの投稿に出会いました( MySQLのtinyint、smallint、mediumint、bigint、intの違いは何ですか? )、PostgreSQLは符号なし整数をサポートしていないことに気付きました。

誰がその理由を説明するのに役立ちますか?

ほとんどの場合、MySQLで自動インクリメントされた主キーとして符号なし整数を使用します。このような設計では、MySQLからPostgreSQLにデータベースを移植するときに、これをどのように克服できますか?

ありがとう。

91
Adrian Hoe

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 =#select(346346 :: uint2);

エラー:ドメインuint2の値がチェック制約「uint2_check」に違反しています

37
Karl Tarbe

これはSQL標準にはないため、実装する一般的な衝動は低くなります。

整数型が多すぎると、型解決システムが脆弱になります。そのため、ミックスにさらに型を追加することに抵抗があります。

とはいえ、それができなかった理由はありません。大変な作業です。

68

CHECK制約を使用できます。例:

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

また、PostgreSQLには、自動インクリメント用のserialおよびbigserialタイプがあります。

29
TriAnMan

最新のドキュメントによると、符号付き整数はサポートされていますが、表では符号なし整数はサポートされていません。ただし、シリアルタイプは、ゼロではなく1から始まることを除いて、符号なしに似ています。しかし、上限は歌われたものと同じです。したがって、システムには真に無署名のサポートはありません。 Peterが指摘したように、署名のないバージョンを実装するための扉が開かれています。コードは頻繁に更新する必要があるかもしれませんが、Cプログラミングでの私の経験からはあまりにも多くの作業が必要です。

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
0
Kemin Zhou