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

使用されているスキーマにシーケンス"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ます。

4

3 に答える 3

3

ケーキは、公開スキーマで、それが配置されていないシーケンスを探していたようです。

Model/Datasource/DboSource.php createこのdiffを使用して最後の挿入getterinfファイルメソッドにスキーマ名を含めるように調整することで修正しました

@@ -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 に答える