CakePHP的2.2 PostgreSQL的失败新行插入 - 数据库错误:未定义表:7 ERROR

2019-10-17 06:22发布

我的问题是如下。

从表中删除多行后,插入新记录到错误同桌的结果。

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

它在以下情况下触发2个查询每行(100额外的在我的情况!)DELETE语句,而不是两个

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

所以这个时候它有改进的余地。

编辑:目前的代码工作,因为它应该与扭捏DboSource

Answer 1:

看来,蛋糕一直在寻找在公共架构序列,其中它不在。

通过调整包括在最后插入架构名吸气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;

我知道,修改的核心是不是要走的路,但只要它是工作这是我没问题。



Answer 2:

这发生在我身上,因为我修改了表的名称,但PostgreSQL的没有改变序列的名称。 知道了这一点,我改变了这一切影响了这个表中的序列的名称,它被解决。



Answer 3:

为了防止这种错误,使用这种约定来命名序列使用CakePHP时:TABLE_NAME _id_seq。 例如:

table name: user
sequence name should be: user_id_seq

如果您alredy有序列,您可以在这样posgres将其重命名

alter sequence user_seq rename to user_id_seq

我不是这种方式来命名序列的乐趣,但它在我的情况稳定,防止这种错误的



文章来源: CakePHP 2.2 with PostgreSQL Failed new row insert - Database Error: Undefined table: 7 ERROR: relation “table_id_seq” does not exist