如何在 PostgreSQL 9.5 中为“int”数据类型设置大小限制

Posted

技术标签:

【中文标题】如何在 PostgreSQL 9.5 中为“int”数据类型设置大小限制【英文标题】:How can I set a size limit for an "int" datatype in PostgreSQL 9.5 【发布时间】:2019-08-19 08:48:04 【问题描述】:

我正在使用 mysql 对来自 SQL 的 PostgreSQL 进行试验,我只是希望使用这段代码创建一个表,该代码是有效的 SQL:

CREATE TABLE flat_10
(
  pk_flat_id INT(30) DEFAULT 1,
  rooms      INT(10) UNSIGNED NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (flat_id)
);

我得到了错误

ERROR:    syntax error at or near "("
LINE 3:   pk_flat_id integer(30) DEFAULT 1,

我在网上进行了搜索,但没有找到答案,而且我似乎无法在 PostgreSQL 手册中找到答案。我做错了什么?

我明确想对可以插入“pk_flat_id”字段的位数设置限制

【问题讨论】:

您的代码仅在 MySQL 中是有效的 SQL :-) 如果这种类型需要可重用,您可能需要查看postgresql.org/docs/10/sql-createdomain.html 【参考方案1】:

我明确想对可以插入“pk_flat_id”字段的位数设置限制

您当前的表定义没有以任何方式强加“大小限制”。在 MySQL 中,intdata 类型的参数只是 hint 用于应用程序在 显示 时列的显示宽度。

您可以毫无问题地将值 2147483647 存储在 int(1) 中。

如果你想限制存储在整数列中的值,你可以使用检查约束:

CREATE TABLE flat_10
(
  pk_flat_id bigint DEFAULT 1,
  rooms      integer NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (flat_id), 
  constraint valid_number 
      check (pk_flat_id <= 999999999)
);

【讨论】:

为什么要为 room_label 列上的 CHAR 数据类型指定大小(或 CHAR(n) 代表的任何内容)? @FlashspeedIfe:因为您在原始表格中也这样做了。而对于字符数据类型,大小确实指定了一个限制。【参考方案2】:

答案是你使用numericdecimal 类型。这些记录在here。

请注意,这些类型可以采用可选的精度参数,但您不希望这样。所以:

CREATE TABLE flat_10
(
  pk_flat_id DECIMAL(30) DEFAULT 1,
  rooms      DECIMAL(10) NOT NULL,
  room_label CHAR(1) NOT NULL,

  PRIMARY KEY (pk_flat_id)
);

Here 是一个 SQL Fiddle。

我不认为 Postgres 支持无符号小数。而且,您似乎真的希望您的密钥具有序列类型,而长位数是多余的。

【讨论】:

【参考方案3】:

将整数更改为数字有效。

CREATE TABLE flat_10
(
  pk_flat_id bigint DEFAULT 1,
  rooms      numeric NOT NULL,
  room_label CHAR(1) NOT NULL,
);

【讨论】:

以上是关于如何在 PostgreSQL 9.5 中为“int”数据类型设置大小限制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 上更改 postgreSQL 9.5 的时区?

如何提高 PostgreSQL 9.5 中的查询性能?

如何确定 upsert 是不是是 PostgreSQL 9.5+ UPSERT 的更新?

如何在Ubuntu 16.04和14.04 LTS中安装PostgreSQL 9.5

CentOS 7 安装配置使用 PostgreSQL 9.5

Linux CentOS 7 安装PostgreSQL 9.5(源码编译)