为什么id序列主键一直在变?

Why does the id serial primary key keep changing?

我刚刚开始了包括 PostgreSQL 在内的全栈 Web 开发人员课程。我一直在做一些练习题,当我点击 运行 SQL 它显示 id,first_name 和 last_name 但是当我输入更多代码行时回答更多问题并再次点击 运行 SQL,身份证号码变成了一个完全不同的号码,我不明白为什么会这样。

在练习题中,我被指示添加更多行,然后将 id 为 2 的条目更新为其他内容,但是如果 id 号不断变化,我该如何更新 id 2? id 2 甚至不在屏幕上。我对 id 序列主键的理解是,当您添加新行时它会自动递增 id 但在这种情况下 id 会不断更改为随机数,为什么要这样做?屏幕截图是课程中的代码,不是我输入的。 http://sqlfiddle.com/#!17/a114f/2 这是 link 但我不确定没有注册课程的人是否可以访问它。抱歉,如果这是一个非常简单的新手问题,但我花了很多时间在网上查找,我真的需要继续前进。

在 SQL Fiddle 中,每次单击右侧的按钮都会转到 "rerun" 您的代码。

但是 SQL Fiddle 不保证主键相同,并且以肯定会导致 pk 递增的方式隔离您的代码。

http://sqlfiddle.com/#!17/a114f/2 这是原始的 fiddle,如果您只是点击那个提交按钮,您可以看到值每次都在变化。

如果您多次提交,您的代码中没有任何内容可以防止重复并发,但是在发现 table 中总是会有不止一行。

据我所知,这是 SQLFiddle 中的错误。

显然 table 定义(或其他)与其他用户共享。如果你做同样的事情,例如使用 db<>fiddle 你总是在删除并重新创建 tables:

后得到相同的 ID

db<>fiddle demo


SQL无论如何,Fiddle 从来没有为我可靠地工作过。另外,它似乎停留在一个非常旧的 Postgres 版本上。因此,您可能会使用不同的东西来练习 SQL 技能或完成作业。

与 a_horse_with_no_name 一样,我也更喜欢 db<>fiddle for SQL code sharing. But if you're restricted to sqlfiddle for whatever reason, you can add a setval() 命令对您的代码强制设置播种值。

select setval('drivers_id_seq',1);

INSERT INTO drivers (first_name, last_name) VALUES ('Amy', 'Hua');

SELECT * from drivers;

参见示例 here (link)。请注意,drivers_id_seq 是一个系统生成的名称,您可以很容易地猜到(如果您需要重新播种您在另一个对象上创建的 serial)。