【问题标题】:CakePHP 2.2 with PostgreSQL Failed new row insert - Database Error: Undefined table: 7 ERROR: relation "table_id_seq" does not exist带有 PostgreSQL 的 CakePHP 2.2 新行插入失败 - 数据库错误:未定义的表:7 错误:关系“table_id_seq”不存在
【发布时间】:2015-08-11 20:54:42
【问题描述】:

我的问题如下。

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

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

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

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

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

编辑:当前代码在调整DboSource 后可以正常工作。

【问题讨论】:

  • 你用纯 SQL 试试这个,还是你使用 cakePHP 函数(保存)?在第二种情况下,显示模型(关系)和插入 cakePHP 的代码
  • 是的,我确实使用蛋糕代码。更新问题

标签: postgresql cakephp cakephp-2.2


【解决方案1】:

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

通过调整以在最后一个插入 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;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 事实并非如此。所有表都是动态生成的,不会发生重命名。问题是基于事实上有不止一个模式包含具有相同名称的表(序列)。 @carlos-barcelona 谢谢你的努力。它可以帮助其他人。
    【解决方案3】:

    为防止出现此错误,请在使用 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
    

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

    【讨论】:

    • 在我的情况下,问题不是序列名称错误,而是蛋糕在公共模式中寻找序列,而不是在用户模式中。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多