主键列(id)不是该表中的列()。

3

我正在按照http://framework.zend.com/manual/en/learning.quickstart.create-model.html的指南进行操作,这与it技术有关。然而,我遇到了一系列问题。目前我遇到的问题是以下错误:

    An error occurred

Application error

Exception information:

Message: Primary key column(s) (id) are not columns in this table ()

Stack trace:

#0 C:\wamp\www\zendtest\quickstart\library\Zend\Db\Table\Abstract.php(982): Zend_Db_Table_Abstract->_setupPrimaryKey()
#1 C:\wamp\www\zendtest\quickstart\library\Zend\Db\Table\Select.php(100): Zend_Db_Table_Abstract->info()
#2 C:\wamp\www\zendtest\quickstart\library\Zend\Db\Table\Select.php(78): Zend_Db_Table_Select->setTable(Object(Application_Model_DbTable_Guestbook))
#3 C:\wamp\www\zendtest\quickstart\library\Zend\Db\Table\Abstract.php(1018): Zend_Db_Table_Select->__construct(Object(Application_Model_DbTable_Guestbook))
#4 C:\wamp\www\zendtest\quickstart\library\Zend\Db\Table\Abstract.php(1326): Zend_Db_Table_Abstract->select()
#5 C:\wamp\www\zendtest\quickstart\application\models\GuestbookMapper.php(58): Zend_Db_Table_Abstract->fetchAll()
#6 C:\wamp\www\zendtest\quickstart\application\controllers\GuestbookController.php(14): Application_Model_GuestbookMapper->fetchAll()
#7 C:\wamp\www\zendtest\quickstart\library\Zend\Controller\Action.php(516): GuestbookController->indexAction()
#8 C:\wamp\www\zendtest\quickstart\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#9 C:\wamp\www\zendtest\quickstart\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 C:\wamp\www\zendtest\quickstart\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#11 C:\wamp\www\zendtest\quickstart\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#12 C:\wamp\www\zendtest\quickstart\public\index.php(26): Zend_Application->run()
#13 {main}  
Request Parameters:

array (
  'controller' => 'guestbook',
  'action' => 'index',
  'module' => 'default',
)  

但我确定我的表格有一个名为id的主键:

CREATE TABLE guestbook (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
    comment TEXT NULL,
    created DATETIME NOT NULL
);

CREATE INDEX "id" ON "guestbook" ("id");

不理解为什么会出现错误。

我该如何查看是否选取了正确的数据库。


1
请检查列名后是否有尾随空格,并发布查询SHOW CREATE TABLE guestbook的输出,以便我们可以仔细检查实际结构。 - Tim Fountain
如何在命令提示符中显示输出? - Zara_tj
我们又见面了! :) ... 既然您正在使用wamp,那么您的系统上必须安装了phpmyadmin。请访问http://localhost/phpmyadmin,在左侧可以看到所有数据库,点击您的数据库。然后,会有一个名为SQL的选项卡,您可以在那里输入@TimFountain的命令并向我们展示输出结果... 另外,请确保表中有一些数据 :) - Keval Domadia
4个回答

1

Zend_Db_Table_Abstract 包含一个受保护的属性,称为 _primary,默认为 id

它假设 id 是表的主键并且是一个序列(自动递增)。

由于您的表定义指定了 id 是主键,因此应该删除第二个 SQL 命令,该命令在 id 列上添加索引。由于它已经是主键,所以它也是索引。

删除表并使用您在问题中提供的 create table 语句重新创建它,只是不要执行 CREATE INDEX 部分。之后您就可以继续进行了。


0

我认为你的SQL模式不正确。尝试创建带有主键的表,就像这样:

CREATE TABLE guestbook (
    id INTEGER NOT NULL AUTO_INCREMENT,
    email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
    comment TEXT NULL,
    created DATETIME NOT NULL,
    PRIMARY KEY (id)
);

所以我一直在研究它,似乎它甚至没有创建数据库,尽管它说它已经创建了。考虑重新安装WAMP并重新开始。 - Zara_tj

0

我遇到了同样的问题。问题是数据库创建在guestbook-dev.db而不是guestbook.db中。你可以通过查看这些文件来检查它。解决方案是将scripts/load.sqlite.php中的代码从
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (null === $env) ? 'development' : $env);
改为:
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (null === $env) ? 'production' : $env);
然后,当然,再次运行脚本。


0

这个错误可能是由于(意外地)使用md5(null)作为缓存ID引起的。或者任何其他习惯值,例如1、0、true、false等等。然而,在这种情况下,null很可能是罪魁祸首,因为它可能是由未定义的变量产生的。

修复方法可能很简单:

    $cache = Zend_Registry::get('cache');
    $cache->remove(md5(null));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接