【问题标题】:SQLSTATE[23505]: Unique violation In-spite of ID set to auto_incrementSQLSTATE[23505]:尽管 ID 设置为 auto_increment,但唯一违规
【发布时间】:2019-11-13 20:40:52
【问题描述】:

我从 PHP artisan 命令创建了迁移,它在我的 Postgres 数据库中创建了一个表,id 设置为 auto_increment

我在 laravel 中做了一些播种机,通过 php artisan db:seed 命令将三行数据馈送到之前创建的表中。

当我在同一个表中通过某种形式插入数据时,它给了我一个错误。

error:SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "roles_pkey" DETAIL: Key (id)=(1) already exists. (SQL: insert into "roles" ("name", "guard_name", "updated_at", "created_at") values (staff, web, 2019-07-03 07:38:37, 2019-07-03 07:38:37) returning "id")

【问题讨论】:

  • 你能发布你的迁移吗?
  • 因为错误说 id=1 已经存在...确保您没有重复的行。提供一些代码来帮助你
  • 如果您在 PostgreSQL 中手动为 INSERT 语句指定“auto_increment”列,则不会使用序列,因此将保持为“1”。我的猜测是,您用来生成随机数据的这个工具忽略了您将表配置为使用数据库内置身份机制并继续使用其他东西这一事实。
  • @jycr753 public function up() { Schema::create('themes', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('user_id'); $table->string('theme_code'); $table->string('theme_name'); $table->integer('sequence'); $table->timestamps(); }); }

标签: laravel postgresql


【解决方案1】:

序列是在每个请求上返回一个大一的值的对象,无论它是在哪个事务上调用的。默认情况下,序列从 1 开始,可以应用于一个表或多个表,因此它无法知道表中已经有多少个值。如果您希望插入工作,则需要手动设置它。

SELECT setval('roles_id_seq', (SELECT coalesce((SELECT max(id) from roles),1)))

此查询假定使用的序列是在 "roles" 表上的列 "id" 上创建的,如果不是,则可以通过检查列 DDL 来找到序列名称,例如NOT NULL DEFAULT setval('the_sequence_name') 并使用它来设置值。

【讨论】:

  • 我以前在 Postgres 中手动完成了这个 setval 很多次,但是我想知道为什么在我最初将主键设置为唯一且自动增量时出现错误。然后通过播种机添加数据,创建id-1,id-2,id-3。那么任何进一步的数据都应该是 id-4,但为什么将 id 分配为 1。
  • 这可能是播种机的问题,可能是在创建表并插入数据后添加了序列。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 2015-05-03
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2014-05-26
相关资源
最近更新 更多