当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL:唯一冲突:7错误:重复键值违反唯一约束“users\u pkey”

梁和颂
2023-03-14

我正在我的Laravel应用程序中使用psql。我正在尝试创建我的用户,并且不断出现此错误

唯一冲突:7错误:重复键值违反唯一约束“users\u pkey”

$user = User::where('account_id','=',$id)->first();
$user->email = $account->email_address;
$user->fb_email = '';
$user->tw_email = '';
$user->fb_access_token = '';
$user->fb_profile_id = '';
$user->fb_page_id = '';
$user->fb_username = '';
$user->save();
CREATE TABLE "users" (
    "id" serial NOT NULL ,
    "account_id" varchar(255) NOT NULL ,
    "email" varchar(255) NOT NULL ,
    "fb_email" varchar(255) NOT NULL ,
    "tw_email" varchar(255) NOT NULL ,
    "created_at" timestamp(0) without time zone,
    "updated_at" timestamp(0) without time zone,
    "fb_access_token" varchar(255) NOT NULL ,
    "fb_profile_id" varchar(255) NOT NULL ,
    "fb_page_id" varchar(255) NOT NULL ,
    "fb_username" varchar(255) NOT NULL ,
    PRIMARY KEY ("id")

);

我做了我想做的事吗?

当我用MySQL钩住我的应用程序时,我现在所拥有的一切都会起作用。

任何提示/建议将对我意义重大。

共有3个答案

梁宪
2023-03-14

此错误通常在导出表并将其导入到其他数据库时发生。

上面的方法很有效,但不幸的是,它们在我的系统上不起作用,我使用的系统是laravel和postgres。

我清空了我的桌子解决了我的问题

TRUNCATE TABLE table_name;
周楷
2023-03-14

下面的代码提供了一种在Laravel中执行此操作的方法,这正是OP所使用的。

php prettyprint-override">// Get all the tables from your database
$tables = \DB::select('SELECT table_name FROM information_schema.tables WHERE table_schema = \'public\' ORDER BY table_name;'); 

// Set the tables in the database you would like to ignore
$ignores = array('admin_setting', 'model_has_permissions', 'model_has_roles', 'password_resets', 'role_has_permissions', 'sessions'); 

//loop through the tables
foreach ($tables as $table) { 

   // if the table is not to be ignored then:
   if (!in_array($table->table_name, $ignores)) { 

       //Get the max id from that table and add 1 to it
       $seq = \DB::table($table->table_name)->max('id') + 1; 

       // alter the sequence to now RESTART WITH the new sequence index from above        
       \DB::select('ALTER SEQUENCE ' . $table->table_name . '_id_seq RESTART WITH ' . $seq); 

    }

}

注意-使用ALTER SEQUENCE“阻止并发事务”。如果不需要的话,可以考虑从上面提供的替代方案中使用SQL语句。

叶晋
2023-03-14

Postgres处理自动递增的方式与MySQL稍有不同。在Postgres中,当您创建serial字段时,您还创建了一个序列字段,用于跟踪要使用的id。此序列字段将以值1开始。

当您向表中插入新记录时,如果您不指定id字段,它将使用序列的值,然后递增序列。但是,如果您指定了id字段,则不会使用该序列,也不会更新该序列。

我假设,当您转到Postgres时,您会播种或导入一些现有用户及其现有ID。当您使用这些用户记录的ID创建这些用户记录时,该序列未被使用,因此它从未被更新。

因此,例如,如果您导入了10个用户,您的用户ID为1-10,但您的序列仍然为1。当您尝试在不指定id的情况下创建新用户时,它会从序列(1)中提取值,并且您会得到一个唯一的冲突,因为您已经有一个id为1的用户。

要解决此问题,需要将users_id_seq序列值设置为现有用户的MAX(id)。您可以阅读此问题/答案以了解有关重置序列的更多信息,但您也可以尝试以下内容(未经测试):

SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;

仅供参考,这在MySQL中不是问题,因为当一个值被手动插入到自动增量字段时,MySQL会自动将自动增量序列更新到最大的列值。

 类似资料:
  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 我有这样的桌子: 我试图插入一些查询到另一个表(device_usage_test1)。这是我的表: 这是我的插入命令: 稍后,我将在device_usage_test1上创建一个插入查询。所以我的设备序列必须是唯一的。但是当我尝试用deviceserial (unique)插入时。它显示错误:< code >错误:重复的键值违反了唯一约束“device _ usage _ device seri

  • 当并发客户机试图将数据插入子表时,我们面临唯一的约束冲突问题。 假设我们有1以下的表格。用户user_id、first_name、last_name。2.项目project_idproject_name和project_description。 两者都有着多对多的关系。 当两个客户端试图创建一个新用户时。假设client1创建了user1(id=aa1),子记录项目(id=1)。Client2还创

  • 这是我的stacktrace: 学生表: 学生实体:学生标识默认为自动递增 postgres控制台(这些学生由sql脚本创建): 在此处输入图像描述 我也尝试过这样生成,但这没有帮助 我用postgreql它似乎我有问题与id Generator,谢谢你的想法和答案

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py

  • 我必须交换同一表的不同行的属性。 有一列“reference_id”在 DB 中具有唯一的约束。 代码: A 级- B级- 异常跟踪: