繁体   English   中英

如何在PostgreSQL中使主键具有X位数字?

[英]How to make the Primary Key have X digits in PostgreSQL?

我对SQL相当陌生,但是一直在努力学习。 我目前在设置主键无论如何都具有8位数字方面遇到问题。

我尝试使用INT(8)但是没有用。 同样, AUTO_INCREMENT在PostgreSQL中不起作用,但是我看到有几种可以自动递增的数据类型,但是仍然存在键不够长的问题。

基本上,我希望数字代表用户ID,从10000000开始并向上移动。 00000001及以上版本也可以使用,对我来说无关紧要。

我看到了一个与之接近的答案,但不幸的是,它不适用于PostgreSQL。

希望我的问题有道理,如果没有,我会尽力澄清。

我的代码(我正在网站上使用该代码尝试为练习项目建立自己的论坛):

CREATE Table users (
user_id     INT(8) NOT NULL AUTO_INCREMENT,
user_name   VARCHAR(30) NOT NULL,
user_pass   VARCHAR(255) NOT NULL,
user_email  VARCHAR(255) NOT NULL,
user_date   DATETIME NOT NULL,
user_level  INT(8) NOT NULL,
UNIQUE INDEX user_name_unique (user_name),
PRIMARY KEY (user_id)
) TYPE=INNODB;

它不适用于PostgreSQL(9.4 Windows x64版本)。 我该怎么办?

您正在混合两个方面:

  • 允许您的PK列使用某些数据类型
  • 您选择显示的格式

AUTO_INCREMENT是MySQL的非标准概念,SQL Server使用IDENTITY(1,1)等。
在Postgres中使用serial列:

CREATE TABLE users (
  user_id serial PRIMARY KEY
, ...
)

这是一种伪类型,它实现为integer数据类型,并具有来自附加SEQUENCE的列默认图形。 integer很容易满足您的情况(-2147483648至+2147483647)。

如果您确实需要强制使用最多8个十进制数字的数字,请添加CHECK约束

CONSTRAINT id_max_8_digits CHECK (user_id BETWEEN 0 AND < 99999999)

要以任何所需的方式显示数字-将0填充为8位数字(对于您的情况),请使用to_char()

SELECT to_char(user_id, '00000000') AS user_id_8digit
FROM   users;

那太快了。 请注意,输出现在是text ,而不是integer
SQL提琴。

您的代码中还有一些其他特定于MySQL的东西:

  • int(8) :使用int
  • datetime :使用timestamp
  • TYPE=INNODB :删除它。

您可以将user_id设置为串行类型列,并将此序列的种子设置为10000000。

为什么?

mysql中的int(8)实际上并不只存储8位数字,它仅显示8位数字

Postgres支持检查约束。 您可以使用如下形式:

create table foo (
  bar_id int primary key check ( 9999999 < bar_id and bar_id < 100000000 )
);

如果这是为了给重要文件(如发票)打上空白,那么就不应该使用序列/ auto_increment

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM