无法从内容类型中删除字段

时间:2017-09-07 22:23:12

标签: drupal drupal-8

每当我尝试从 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

如果这有任何区别。

2 个答案:

答案 0 :(得分:3)

我也经历过这一点,挖掘代码。我发现这就是为什么你没有删除字段后的原因,如下:

  • 执行cron gazillion次

field_configfield_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_deletedfield_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次此过程,但最终它解决了该错误。