【问题标题】:How can I set a size limit for an "int" datatype in PostgreSQL 9.5如何在 PostgreSQL 9.5 中为“int”数据类型设置大小限制
【发布时间】: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”字段的位数设置限制

【问题讨论】:

标签: sql postgresql database-design sqldatatypes


【解决方案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,
    );
    

    【讨论】:

      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多