2017-04-04 136 views
0

我不明白它是如何顯示主鍵的重複值錯誤,即使id是一個自動增量和主鍵。請參閱下面的錯誤。Yii Framework 2.0主鍵的重複鍵值

Integrity constraint violation – yii\db\IntegrityException 

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "user_pkey" 
DETAIL: Key (id)=(2) already exists. 
+1

這意味着不便插入行,而無需使用序列或更新的ID,以值2 –

+0

雅正確..它如何採取2也讓我感到困惑? – lalithkumar

+0

我已經在localhost做了應用程序,並把它推入heroku ..之後,只有它的顯示錯誤.. – lalithkumar

回答

2

它意味着不便插入一排,而無需使用序列或更新id來值2

例如:

t=# create table so47(id serial primary key,v text); 
CREATE TABLE 
t=# insert into so47(v) select 'some'; 
INSERT 0 1 
t=# insert into so47(id,v) select 2, 'more'; 
INSERT 0 1 
t=# insert into so47(v) select 'some more'; 
ERROR: duplicate key value violates unique constraint "so47_pkey" 
DETAIL: Key (id)=(2) already exists. 

回答在評論的問題是: Postgres使用序列爲autoincrement列獲取下一個值。要檢查下一個值,運行(在我的例子情況下):

t=# select * from so47_id_seq ; 
sequence_name | last_value | start_value | increment_by |  max_value  | min_value | cache_value | log_cnt | is_cycled | is_called 
---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- 
so47_id_seq |   2 |   1 |   1 | 9223372036854775807 |   1 |   1 |  31 | f   | t 
(1 row) 

重置NEXTVAL,你必須:

t=# alter sequence so47_id_seq restart with 3; 
ALTER SEQUENCE 
t=# insert into so47(v) select 'some more'; 
INSERT 0 1 

然後,它會從不存在的價值恢復序列。

在你的情況,你需要:

select max(id)+1 from "user" 

得到的值,然後:

alter sequence user_id_seq restart with SELECTED_VALUE; 
+0

你是偉大的。非常感謝你。它的工作像魅力。 – lalithkumar