如何在 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 中,int
data 类型的参数只是 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】:答案是你使用numeric
或decimal
类型。这些记录在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 的时区?
如何确定 upsert 是不是是 PostgreSQL 9.5+ UPSERT 的更新?
如何在Ubuntu 16.04和14.04 LTS中安装PostgreSQL 9.5