创建表时出现PDOException:未找到基表或视图[关闭]


8

我在MariaDB 5.5.33上运行了Drupal。当我运行update.php(从Drupal 6升级到Drupal 7.28之后)时,出现错误消息:

失败:PDOException:SQLSTATE [42S02]:找不到基表或视图:1146表'webdb.location_country'不存在:CREATE TABLE {location_country}(codeCHAR(2)NOT NULL COMMENT'主键:两个字母的ISO国家/地区代码';,nameVARCHAR(255)非空默认值'COMMENT'Full Country Name',PRIMARY KEY(code))ENGINE = InnoDB DEFAULT CHARACTER SET utf8注释'由location.module管理的国家/地区数据。数组()indb_create_table()(/home/web/public_html/includes/database/database.inc的第2720行)。

当我尝试运行命令

创建表{location_country}(codeCHAR(2)NOT NULL COMMENT'主键:两个字母的ISO国家/地区代码',nameVARCHAR(255)NOT NULL DEFAULT''COMMENT'Full Country Name',PRIMARY KEY(code))ENGINE = InnoDB DEFAULT CHARACTER SET utf8注释'由location.module管理的国家/地区数据。

在phpMyAdmin中,我得到一个错误

#1064-您的SQL语法有误;检查与您的MariaDB服务器版本相对应的手册,以获取在'{location_country}(codeCHAR(2)NOT NULL COMMENT'Primary Key:Two letter IS'in line 1)附近使用的正确语法

但是我无法找出问题出在哪里。

Answers:


6

我遇到了同样的问题,在我的情况下,问题是数据库表引擎:默认情况下,它是InnoDB,(由于某些原因,我仍然不必理解)Drupal报告此错误。

您必须将数据库引擎更改为MyISAM。首先,必须确保将由Drupal创建的表具有MyISAM作为引擎:在中/includes/database/mysql/schema.inc,查找createTableSql($name, $table),然后将InnoDB更改为MyISAM;然后,保存它。
由于您的数据库中有一些表MyISAM,因此也必须将它们更改为表,因此只需将数据库导出为.sql文件即可,在文本编辑器中将其打开并替换Engine=InnoDBEngine=MyISAM。现在,在服务器中,phpmyadmin删除数据库的所有表,并.sql在其中导入新文件。这样,您所有的表以及将由Drupal创建的表都是MyISAM。


确实,问题出在引擎上。我将表创建为MyISAM。然后我将其导出,更改为InnoDB,然后尝试重新导入。没用 因此,按照链接上的描述,我切换到了MyISAM。它似乎正在工作。非常感谢你。
蒂利亚2014年

3

由于其他有关此PDOException的问题的答案(包括与InnoDB引擎无关的答案)被标记为重复项,并重定向到该问题,因此我想这是有关此问题的答案的规范位置。

我在卸载模块时遇到了几次,并且站点上不存在要查找的表(因为它是偶然删除的,因为模式定义中存在拼写错误.install,或出于某些其他原因)。

解决该问题的最简单方法是update.php手动运行数据库更新脚本()。

在使站点恢复活力之后,您应该尝试找出问题的根本原因并加以解决。


2

在用作原始SQL时,您需要删除表名周围的花括号。

例如:

CREATE TABLE location_country ( `code` CHAR(2) NOT NULL COMMENT 'Primary Key: Two letter ISO Country Code', `name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Full Country Name ', PRIMARY KEY (`code`) ) ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COMMENT 'Country data managed by location.module.';

有趣。为什么Drupal会以错误的sysntax显示SQL命令?无论如何,它没有用。它在TEST DB中工作,而不是期望的工作。最终,解决方案如下所述切换到MyISAM引擎。
蒂利亚(Tilia)2014年

Drupal添加大括号以检测表名称并在执行查询之前应用数据库前缀。
sanzante

1

这与将Drupal 7从笔记本电脑上的一个开发站点移动到另一个开发站点时遇到的错误消息相同。在检查了Drupal数据库中的表之后,我发现未导入完整的sql转储(使用Adminer和“从服务器”选项adminer.sql)。

查找SQL转储末尾附近的Drupal 7数据库表,按字母顺序排列: user *views *webform *workbench *xmlsitemap *以查看是否全部导入。

在使用drush sql-cli < database.sql删除所有数据库表后,我曾经将sql dump导入到Drupal数据库中drush sql-drop

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.