Drupal Can';t从内容类型中删除字段

Drupal Can';t从内容类型中删除字段,drupal,drupal-8,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

每当我试图从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
唯一的区别是表散列数据,即已删除的数据,我试图删除的每个字段都引用了不同的表。我尝试重新安装Drupal并重新导入配置,但没有成功

有什么建议吗

更新: 检查数据库后,有许多这样的表: 字段\u已删除\u修订\u df347fb61b 和 字段\u已删除\u df347fb61b


如果这有什么不同。

我也经历过这种情况,请深入挖掘代码。我发现,在您删除字段后,字段未被删除的所有原因如下:

  • 执行cron的次数达数百万次

field\u config
field\u config\u instance
中的条目在已删除列中的值可能为1

这意味着它们被标记为删除,但在运行cron之前不会被删除(已删除的字段数据在
field\u cron()
中被清除)

除了运行cron删除已删除的数据之外,您还可以手动运行
field\u purge\u batch($batch\u size)

要使用的
$batch_size
将根据您的服务器环境和需要而有所不同。我使用的值低至5,高至10000

关于
字段\u purge\u batch()
函数


这里有一个可能的解决方案来解决您的问题,但是首先备份您的数据库。别偷懒,如果出了什么事,它会救你的

使用drush:

drush eval "field_purge_batch(500)"
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1
您可能需要运行几次,或者增加
$batch\u size
,那么即使在运行cron之后,仍然可能会有
field\u deleted
field\u deleted\u revision

使用SQL查询:

drush eval "field_purge_batch(500)"
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1

如果结果为空,则可以安全地删除那些剩余的表。

解决此问题的唯一方法是从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\u deleted\u data\u
后面的代码。然后运行:

drush php-eval 'field_purge_batch(1000);'
这可能会使用新代码生成错误。我不得不经历这个过程3次,但最终它解决了这个错误