it-swarm.com.de

Warum ist in PostgreSQL keine vorzeichenlose Ganzzahl verfügbar?

Ich bin auf diesen Beitrag gestoßen ( Was ist der Unterschied zwischen tinyint, smallint, mediumint, bigint und int in MySQL? ) und erkannte, dass PostgreSQL keine Ganzzahl ohne Vorzeichen unterstützt.

Kann mir jemand erklären, warum das so ist?

Meistens verwende ich vorzeichenlose Ganzzahlen als automatisch inkrementierten Primärschlüssel in MySQL. Wie kann ich das beheben, wenn ich meine Datenbank von MySQL nach PostgreSQL portiere?

Vielen Dank.

74
Adrian Hoe

Es wurde bereits beantwortet, warum postgresql unsignierte Typen fehlt. Ich würde jedoch vorschlagen, Domänen für nicht signierte Typen zu verwenden.

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) }

Domäne ist wie ein Typ, jedoch mit einer zusätzlichen Einschränkung.

Für ein konkretes Beispiel könnten Sie verwenden

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

Folgendes gibt psql, wenn ich versuche, den Typ zu missbrauchen.

DS1 = # select (346346 :: uint2);

FEHLER: Wert für Domäne uint2 verstößt gegen die Prüfbedingung "uint2_check"

31
Karl Tarbe

Es ist nicht im SQL-Standard, daher ist der allgemeine Drang zur Implementierung geringer.

Wenn zu viele verschiedene Integer-Typen vorhanden sind, wird das Typauflösungssystem empfindlicher. Daher gibt es einige Widerstände gegen das Hinzufügen weiterer Typen.

Das heißt, es gibt keinen Grund, warum dies nicht möglich war. Es ist nur viel Arbeit.

61

Sie können eine CHECK-Einschränkung verwenden, z.

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

PostgreSQL hat auch die Typen serial und bigserial für das automatische Inkrementieren.

24
TriAnMan

Laut der neuesten Dokumentation wird die singende Ganzzahl unterstützt, jedoch keine vorzeichenlose Ganzzahl in der Tabelle. Der serielle Typ ähnelt jedoch unsigniert, außer dass er von 1 und nicht von Null beginnt. Die obere Grenze ist jedoch dieselbe wie die des Singens. Das System hat also wirklich keine Unterstützung ohne Vorzeichen. Wie von Peter ausgeführt, ist die Tür offen, um die vorzeichenlose Version zu implementieren. Der Code muss möglicherweise viel aktualisiert werden, zu viel Arbeit aus meiner Erfahrung mit der C-Programmierung.

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