带有PostgreSQL的CakePHP 2.2新行插入失败 - 数据库错误:未定义表:7错误:关系“table_id_seq”不存在

时间:2012-09-28 11:06:03

标签: postgresql cakephp cakephp-2.2

我的问题如下。

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

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运行。

3 个答案:

答案 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

我没有这种方式来命名序列,但它在我的情况下预防了这种错误