首页 文章

为什么PostgreSQL中没有无符号整数?

提问于
浏览
76

我遇到了这篇文章(What is the difference between tinyint, smallint, mediumint, bigint and int in MySQL?)并意识到PostgreSQL不支持无符号整数 .

任何人都可以帮忙解释为什么会如此?

大多数时候,我使用无符号整数作为MySQL中的自动递增主键 . 在这样的设计中,当我将数据库从MySQL移植到PostgreSQL时,如何克服这个问题呢?

谢谢 .

4 回答

  • 24

    已经回答了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”

  • 0

    它不符合SQL标准,因此实现它的一般要求较低 .

    具有太多不同的整数类型会使类型分辨率系统更加脆弱,因此在混合中添加更多类型会有一些阻力 .

    也就是说,没有理由不能这样做 . 这只是很多工作 .

  • 31

    您可以使用CHECK约束,例如:

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

    PostgreSQL还有 serialbigserial 类型用于自动增量 .

  • 61

    根据最新文档,支持singed整数但表中没有无符号整数 . 但是,串行类型有点类似于unsigned,除了它从1开始而不是从0开始 . 但上限与烧焦相同 . 所以系统真的没有未签名的支持 . 正如彼得所指出的,门是开放的,以实现未签名的版本 . 代码可能需要进行大量更新,这与我使用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
    

相关问题