我的问题如下。
从表中删除多行后,将新记录插入同一个表会导致错误。
Database Error
Error: SQLSTATE[42P01]:
Undefined table: 7 ERROR: relation "order_details_id_seq" does not exist
表
CREATE TABLE schema.order_details (
id serial NOT NULL,
order_id integer NOT NULL,
field_1 integer,
field_2 real,
field_3 character varying(15),
CONSTRAINT order_details_pkey PRIMARY KEY (id )
)
WITH (
OIDS=FALSE
);
插入是
INSERT INTO "schema"."order_details" ("order_id", "field_1", "field_2", "field_3")
VALUES (37, 1, 2, 'value');
序列“schema”。使用的模式中存在“order_details_id_seq”。
CREATE SEQUENCE schema.order_details_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 37
CACHE 1;
模型。
// Model
class Order extends AppModel {
public $useDbConfig = 'other_data';
public $hasMany = array(
'OrderDetail' => array(
'className' => 'OrderDetail',
'foreignKey' => 'order_id',
'dependent' => true,
'order' => array(
'OrderDetail.order_id',
'OrderDetail.field_1'
))
);
class OrderDetail extends AppModel {
public $useDbConfig = 'other_data';
public $belongsTo = array(
'Order' => array(
'className' => 'Order',
'foreignKey' => 'order_id',
'dependent' => true
),
// model Order save code on recreation of order
$this->OrderDetail->deleteAll(array('OrderDetail.order_id' => $this->id));
此时尝试插入$this->OrderDetail->query('VACUUM FULL ANALYZE order_details');
无效
foreach ($details as $d) {
$this->OrderDetail->create();
$this->OrderDetail->save($d /*array(
'order_id' => $this->id,
'field_1' => 1,
'field_2' => 2,
'field_3' => 'value'
)*/);
}
我在第一个foreach循环中遇到错误。 最奇怪的是问题出现并在一段时间后随机消失。
有关它可能是什么以及如何摆脱它的任何建议?
目前使用代码解决了问题。
$this->Order->id = $id;
$this->Order->delete();
它为每行激活2个查询(在我的情况下为100个额外!)删除语句而不是两个
$this->OrderDetail->deleteAll(array('OrderDetail.order_id' => $id));
所以这次还有改进的空间。
编辑:目前代码可以通过调整DboSource
运行。
答案 0 :(得分:2)
似乎蛋糕在公共架构中查找它所在的序列。
通过调整以在最后一次插入getter inf文件Model/Datasource/DboSource.php
create
方法中包含模式名称来解决此问题
@@ -1006,7 +1006,7 @@
if ($this->execute($this->renderStatement('create', $query))) {
if (empty($id)) {
- $id = $this->lastInsertId($this->fullTableName($model, false, false), $model->primaryKey);
+ $id = $this->lastInsertId($this->fullTableName($model, false, true), $model->primaryKey);
}
$model->setInsertID($id);
$model->id = $id;
我知道修改核心不是可行的方法,但只要它正常工作,我就可以了。
答案 1 :(得分:1)
这发生在我身上,因为我修改了表的名称,但PostgreSQL没有更改序列的名称。知道了这一点,我改变了影响该表的序列的名称,并且已经解决了。
答案 2 :(得分:0)
要防止出现此错误,请在使用cakephp时使用此约定命名序列: table_name _id_seq。例如:
table name: user
sequence name should be: user_id_seq
如果你有序列,你可以像这样重复命名
alter sequence user_seq rename to user_id_seq
我没有这种方式来命名序列,但它在我的情况下预防了这种错误