CakePHP: Unique violation: 7 ERROR: duplicate key value violates unique constraint
尝试删除一堆记录然后插入新记录后,我遇到以下错误:
1 2 3 4 | Error: SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint"routes_pkey" DETAIL: Key (id)=(1328) already exists. SQL Query: INSERT INTO routes (agency_id, route_identifier, short_name, long_name, description, route_color, text_color) VALUES (:c0, :c1, :c2, :c3, :c4, :c5, :c6) RETURNING * |
这是代码的简化版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $routes = TableRegistry::get('Routes'); $routes->deleteAll(['agency_id' => $agency->id]); # Data to be updated $patchData = [ 'stops' => $stopData, 'static_data_modified' => Time::now() ]; $patchOptions = [ 'associated' => ['Stops.Routes'] ]; # If: The stops have already been added to the DB # Then: Remove them from the patch data if (isset($stopData['_ids'])) { unset($patchData['stops']); # Change settings for this implementation type $patchOptions = []; $stopCount = count($stopData['_ids']); } $agency = $this->Agencies->patchEntity($agency, $patchData, $patchOptions); $this->Agencies->save($agency); |
似乎出于某种原因,Postgres认为我正在插入一个带有重复主键的记录。但我无法看到我的代码是如何实现的。
这是我在SQL日志末尾看到的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | DELETE FROM routes WHERE agency_id = 51 BEGIN SELECT 1 AS"existing" FROM agencies Agencies WHERE Agencies.id = 51 LIMIT 1 INSERT INTO routes ( agency_id, route_identifier, short_name, long_name, description, route_color, text_color ) VALUES ( 51, '100001', '1', '', 'Kinnear - Downtown Seattle', '', '' ) RETURNING * ROLLBACK |
任何想法为什么我看到这个错误?
我在使用Postgresql 9.4的CakePHP v3.1上
我试图添加这个,但它没有改变任何东西:
1 2 | $connection = ConnectionManager::get('default'); $results = $connection->execute('SET CONSTRAINT = routes_pkey DEFERRED'); |
以下是我在没有找到解决方案的情况下阅读的类似问题:
- 错误:重复键值违反了postgres中的唯一约束
- cakephp重复键值违反了唯一约束
- 错误:重复键值违反唯一约束
- 错误:重复键值违反唯一约束"xak1fact_dim_relationship"
- postgresql:错误重复键值违反唯一约束
- https://stackoverflow.com/questions/33416321/postgresql-bdr-error-duplicate-key-value-violates-unique-constraint-bdr-node
UPDATE
在muistooshort的评论之后,我删除了路由表中的所有记录并重新运行代码,它运行正常。当我在那之后第二次运行它时,它也工作得很好。所以我认为这支持mu的理论,即db中的现有记录(而不是我的代码)存在问题。我认为现在更好的问题是DB中导致这种情况究竟是什么情况以及如何解决这些问题?
PostgreSQL中的
例如:
1 2 3 4 5 | create table t ( id serial not null primary key ); insert into t (id) values (1); insert into t (id) values (DEFAULT); |
将产生唯一性违规,因为
演示:http://sqlfiddle.com/#!15/17534/1
大概在某个时候某个地??方添加了一行
在任何情况下,最简单的方法是使用
1 |
序列应该被称为
因此,如果我们将上一个示例更新为:
1 2 3 4 5 6 |
然后我们在表中得到
演示:http://sqlfiddle.com/#!15/17534/7