NodeJS Postgressql BIGSERIAL自动递增,即使由于UNIQUE约束错误而未创建行

vlf7wbxs  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(163)

我是一个初学者在postgresql,我得到了这个问题,我不知道如何解决它。这是如何重现问题:我有一个表,其中的列类似于(user_id BIGSERIAL,email VARCHAR(255)UNIQUE)。我插入(使用INSERT INTO TABLE)一行电子邮件,我得到user_id 1,然后我插入另一列相同的电子邮件,它给出了一个错误,我再次尝试插入一行,但这次是不同的电子邮件,它被创建,但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');

现在,如果我再次插入相同的电子邮件,我会得到一个重复的错误,如果我插入一个新的电子邮件后,我会得到一个user_id值为3,而只有两行。
我在nodejs中使用pg包。我试图创建一个应用程序使用PERN堆栈。我认为我不会依赖于postgresql的UNIQUE约束,而是获取数据来查看电子邮件是否已经存在,但这对我来说似乎不是理想的解决方案。

stszievb

stszievb1#

这是正常的,并按设计工作。序列不是事务性的。参见the documentation
由于nextvalsetval调用永远不会回滚,因此如果需要“无间隙”分配序列号,则无法使用序列对象。可以通过使用包含计数器的表的排他锁定来构建无间隙分配;但是这种解决方案比序列对象昂贵得多,特别是如果许多事务同时需要序列号。
请参阅this article了解更多信息。

相关问题