唯一违规:7错误:重复键值违反唯一约束“users_pkey”

时间:2016-06-22 14:17:04

标签: php mysql postgresql laravel laravel-5

我在Laravel App中使用psql。 我正在尝试创建我的用户,并且我一直收到此错误

  

唯一违规:7错误:重复键值违反唯一约束“users_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")

);

我做过not假设的任何事情吗?

当我使用MySQL将我的应用程序挂钩时,我现在所使用的是什么。

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

截图

enter image description here

2 个答案:

答案 0 :(得分:23)

Postgres处理自动递增的方式与MySQL略有不同。在Postgres中,当您创建// add tabs to the document foreach($this->signers as $signerId => $signer) { $this->sigTabs[$signerId]->setSignHereTabs($this->sigFields); $this->sigTabs[$signerId]->setDateSignedTabs($this->dateSignedFields); $this->signers[$signerId]->setTabs($this->sigTabs[$signerId]); } 字段时,您还创建了一个序列字段,用于跟踪要使用的ID。该序列字段将以值1开始。

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

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

因此,例如,如果您导入了10个用户,则您拥有ID为1-10的用户,但您的序列仍为1.当您尝试创建新用户而未指定ID时,它会从中提取值序列(1),你得到一个唯一的违规,因为你已经有一个id为1的用户。

要解决此问题,您需要将id序列值设置为现有用户的MAX(id)。您可以阅读this question/answer以获取有关重置序列的更多信息,但您也可以尝试类似(未经测试)的内容:

users_id_seq

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

答案 1 :(得分:1)

$tables = \DB::select('SELECT table_name FROM information_schema.tables WHERE table_schema = \'public\' ORDER BY table_name;');
    $ignores = array('admin_setting', 'model_has_permissions', 'model_has_roles', 'password_resets', 'role_has_permissions', 'sessions');
    foreach ($tables as $table) {
        if (!in_array($table->table_name, $ignores)) {
            $seq = \DB::table($table->table_name)->max('id') + 1;
            \DB::select('ALTER SEQUENCE ' . $table->table_name . '_id_seq RESTART WITH ' . $seq);

        }

    }