为什么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
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
)。
我刚刚开始了包括 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:
后得到相同的 IDSQL无论如何,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
)。