当没有序列存在时,CakePHP在Oracle上调用seq.currval

时间:2011-06-08 16:07:58

标签: oracle cakephp

当尝试将记录插入表中时,我收到序列错误:

Query: SELECT my_table_seq.currval FROM dual
Warning (512): SQL Error: ORA-02289: sequence does not exist

此表上没有序列。它更像是HABTM。我有一张桌子:

CREATE TABLE "MYSCHEMA"."MY_TABLE"
(
    "WORK_ID"   NUMBER NOT NULL ENABLE,
    "ITEM_ID" NUMBER NOT NULL ENABLE,
    CONSTRAINT "MY_TABLE_PK" PRIMARY KEY ("WORK_ID", "ITEM_ID")
)

我使用以下方法手动添加两个ID:

$this->MyModel->set(array('work_id' => 1, 'item_id' => 2));
$this->MyModel->save();

任何想法如何防止错误?我只需要$this->MyModel->query()并手动运行查询吗?

2 个答案:

答案 0 :(得分:1)

CakePHP期望连接表(作为HABTM关系的一部分)具有自己的主键。

请参阅http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM

在你的情况下:

CREATE TABLE MY_TABLE
(
    ID        NUMBER NOT NULL,
    WORK_ID   NUMBER NOT NULL,
    ITEM_ID   NUMBER NOT NULL,
    CONSTRAINT MY_TABLE_PK PRIMARY KEY (ID),
    CONSTRAINT MY_TABLE_UK UNIQUE (WORK_ID, ITEM_ID)
)

不要忘记添加MY_TABLE_SEQ序列:

CREATE SEQUENCE MY_TABLE_SEQ;

答案 1 :(得分:0)

当cake调用oracle表的lastinsertid时,它会查询该表的序列。如果没有提供序列,它只假定$ tablename + _seq。

你可以做的是告诉模板上的cakephp你用于该表的顺序是什么。

MyModel.php

class MyModel extends AppModel{
//in my case 
//my table name was so long it required a shorter sequence name :D
var $sequence = 'my_table_seq';
...
}