每当我尝试从 ANY 内容类型中删除 ANY 字段时,我都会收到以下错误:
Uncaught PHP Exception Drupal\\Core\\Database\\DatabaseExceptionWrapper: "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'drupal.field_deleted_data_35ab99eaa1' doesn't exist: SELECT DISTINCT t.entity_id AS entity_id\nFROM \n{field_deleted_data_35ab99eaa1} t\nWHERE bundle = :db_condition_placeholder_0\nLIMIT 10 OFFSET 0; Array\n(\n [:db_condition_placeholder_0] => slider_images\n)\n" at /var/www/html/web/core/lib/Drupal/Core/Database/Connection.php line 685
唯一的区别是表哈希数据,I.E。 deleted_data_xxxx,我尝试删除的每个字段都引用了一个不同的表。我尝试重新安装Drupal并重新导入我的配置,但没有运气。
有什么建议吗?
更新: 检查数据库后,有许多这样的表: field_deleted_revision_df347fb61b 和 field_deleted_df347fb61b
如果这有任何区别。
答案 0 :(得分:3)
我也经历过这一点,挖掘代码。我发现这就是为什么你没有删除字段后的原因,如下:
field_config
和field_config_instance
中的条目在已删除列中的值可能 1 。
这意味着它们被标记为删除,但在运行cron之前实际上不会被删除(已删除的字段数据在field_cron()
中被清除)。
作为运行cron以删除已删除数据的替代方法,您可以手动运行field_purge_batch($batch_size)
。
要使用的$batch_size
会因您的服务器环境和需求而异。我使用的值低至5,高达10000。
Here more informations关于field_purge_batch()
函数。
这是解决问题的可能解决方案,但首先备份数据库。如果出现问题,不要偷懒,它会拯救你的屁股。
使用drush:
drush eval "field_purge_batch(500)"
您可能需要运行几次,或者增加$batch_size
,然后可能仍有field_deleted
和field_deleted_revision
表,即使在运行cron之后
使用SQL查询:
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1
如果你是空的,你可以安全地删除那些剩余的表。
答案 1 :(得分:0)
我能解决此问题的唯一方法是从sql命令行(使用drush sql-cli
)创建丢失的表,例如:
CREATE TABLE `field_deleted_data_XXX` (
`bundle` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '',
`deleted` tinyint(4) NOT NULL DEFAULT '0',
`entity_id` int(10) unsigned NOT NULL,
`revision_id` int(10) unsigned NOT NULL,
`langcode` varchar(32) CHARACTER SET ascii NOT NULL DEFAULT '',
`delta` int(10) unsigned NOT NULL,
`content_translation_source_value` varchar(12) CHARACTER SET ascii NOT NULL,
PRIMARY KEY (`entity_id`,`deleted`,`delta`,`langcode`),
KEY `bundle` (`bundle`),
KEY `revision_id` (`revision_id`) );
用错误消息中XXX
之后的代码替换field_deleted_data_
。然后运行:
drush php-eval 'field_purge_batch(1000);'
这可能会生成带有新代码的错误。我必须经历3次此过程,但最终它解决了该错误。