0

我对 SQL 很陌生,但一直在努力学习。我目前被困在一个问题上,无论如何将主键设置为 8 位数字。

我尝试使用INT(8),但没有奏效。在 PostgreSQL 中也AUTO_INCREMENT不起作用,但我看到有几个自动递增的数据类型,但我仍然遇到键不够长的问题。

基本上我想让数字代表用户 ID,从开始到10000000向上移动。00000001并且 up 也可以,对我来说没关系。

我看到了一个接近这个的答案,但不幸的是它不适用于 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 版本)中不起作用。我该怎么办?

4

3 回答 3

2

您正在混合两个方面:

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

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

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

这是作为数据类型实现的伪integer类型,具有来自附加的列默认绘图SEQUENCEinteger对于您的情况来说足够大(-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: 扔掉吧。
于 2015-04-12T00:51:33.053 回答
0

为什么?

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

Postgres 支持检查约束。你可以使用这样的东西:

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

如果这是为了对重要的文档(如不应有间隙的发票)进行编号,那么您不应该使用序列 / auto_increment

于 2015-04-11T19:25:28.773 回答
0

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

于 2015-04-11T18:30:47.063 回答