1

我的问题如下。

从表中删除多行后,将新记录插入同一个表会导致错误。

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');

存在使用的模式中的序列“模式”。“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();

它为删除语句的每一行(在我的情况下额外 100 个!)触发 2 个查询,而不是在

$this->OrderDetail->deleteAll(array('OrderDetail.order_id' => $id));

所以这次它有改进的空间。

编辑:当前代码可以正常工作,因为它应该与调整DboSource的 .

4

3 回答 3

3

蛋糕似乎在公共模式中寻找它不位于的序列。

通过调整以在Model/Datasource/DboSource.php create具有此差异的最后插入 getter inf 文件方法中包含模式名称来修复它

@@ -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;

我知道修改核心不是要走的路,但只要它可以工作,我就可以了。

于 2012-10-09T19:15:17.160 回答
1

这发生在我身上,因为我修改了表的名称,但 PostgreSQL 没有更改序列的名称。知道了这一点,我更改了影响该表的序列的名称并解决了。

于 2013-06-06T15:59:27.753 回答
1

为防止出现此错误,请在使用 cakephp 时使用此约定命名您的序列:table_name _id_seq。例如:

table name: user
sequence name should be: user_id_seq

如果你已经有序列,你可以像这样在 posgres 中重命名它

alter sequence user_seq rename to user_id_seq

我不喜欢这种命名序列的方式,但在我的情况下它可以防止这种错误

于 2015-08-11T12:54:42.510 回答