我对PostgreSQL还是个初学者,我遇到了这个问题,我不知道如何解决它. 以下是重现问题的方法: 我有一个包含(USER_ID BIGSERIAL,EMAIL VARCHAR(255)UNIQUE)列的表.我插入(使用INSERT INTO TABLE)一行邮箱,获得user_id 1,然后插入另一列具有相同邮箱的列,它给出一个错误,我再次try 插入一行,但这一次使用不同的邮箱,它被创建,但user_id是3.我预期它是2.

以下是可以重现该问题的PostgreSQL命令:

CREATE TABLE users(user_id BIGSERIAL, email VARCHAR(255) UNIQUE);
INSERT INTO users(email) VALUES ('myemail@email.com');
INSERT INTO users(email) VALUES ('myemail@email.com');
INSERT INTO users(email) VALUES ('mynewemail@email.com');

现在,如果我再次插入相同的邮箱,我将得到一个重复错误,如果我在那之后插入一个新的邮箱,我将得到一个值为3的user_id,而只有两行.

我在NodeJS中使用PG包.我正在try 使用Pern堆栈创建一个应用程序.我以为我不会依赖于PostgreSQL的唯一约束,而是取而代之的是获取数据以查看邮箱是否已经存在,但在我看来这不是理想的解决方案.

推荐答案

这是正常的,并且按照设计工作.序列不是事务性的.请参见the documentation:

由于nextvalsetval调用永远不会回滚,因此如果需要"无缝"分配序列号,则不能使用Sequence对象.通过使用包含计数器的表的独占锁定来构建无缝分配是可能的;但这种解决方案比序列对象昂贵得多,特别是在许多事务同时需要序列号的情况下.

有关详细信息,请参阅this article.

Node.js相关问答推荐

Node.js promise 循环中的所有多个API调用

使用NodeJS在S3上传文件时的格式问题

node 上的磁盘压力

DocuSign:调用createEntaine时,RequestJWTApplicationToken返回401 AUTHORIZATION_INVALID_TOKEN

在父模式中设置默认值.

如何使用对象中的常量值验证字符串字段?

AJAX 和 Node JS:在我的服务器中接收空数据

users.watch(在 gmail google api 中)如何收听通知?

带有 node.js 和 express 的基本网络服务器,用于提供 html 文件和assets资源

我们如何或可以通过 npm 和 Meteor 使用 node 模块?

如何使用 Puppeteer 从输入中删除现有文本?

eslint - vscode 的可选链接错误

node.js 是否支持yields ?

Mongoose:查找、修改、保存

Connect/Express 中的session和cookieSession中间件有什么区别?

在 Mongoose 中创建外键关系

create-react-app,安装错误(找不到命令)

有人在 NodeJS 中实现过 wiki 吗?

npm package.json 操作系统特定脚本

`return function *(){...}` 是什么意思?