I added a column in customer_grid_flat table using UpgradeSchema.php . But each time I run the command php bin/magento indexer:reindex this column gets deleted. I cannot figure out why this happen.Please help in this regard. I attached below the customer_eav_attribute and eav_attribute. enter image description here

enter image description here

  • What column you have added? Any customer attribute? Sep 12, 2018 at 7:31
  • I added a column named customer_type Sep 12, 2018 at 7:36
  • Check my answer. Sep 12, 2018 at 7:48

3 Answers 3


Can you try using InstallData instead of Upgrade schema -


namespace Namespace\Modulename\Setup; 

use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Customer\Model\Customer;
use Magento\Eav\Model\Entity\Attribute\Set as AttributeSet;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface

     * @var \Magento\Customer\Setup\CustomerSetupFactory
    private $customerSetupFactory;

     * @var \Magento\Eav\Model\Entity\Attribute\SetFactor
    private $attributeSetFactory;    

     * Init
     * @param \Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory
    public function __construct(
        CustomerSetupFactory $customerSetupFactory,
        AttributeSetFactory $attributeSetFactory
    ) {
        $this->customerSetupFactory = $customerSetupFactory;
        $this->attributeSetFactory = $attributeSetFactory;

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) {
         /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, 'customer_type', [
            'type' => 'int',
            'label' => 'Customer Type',
            'input' => 'select',
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'sort_order' => 100,
            'position' => 100,
            'is_used_in_grid' => true,
            'system' => 0,
            'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',

        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'customer_type')
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['adminhtml_customer'],


Then in your module in customer_columns tag in customer_listing.xml :

<column name="customer_type">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">select</item>
                    <item name="editor" xsi:type="string">select</item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="label" xsi:type="string" translate="true">Customer Type</item>
                    <item name="sortOrder" xsi:type="number">100</item>

Then create app/etc/indexer.xml :

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
    <indexer id="customer_grid">
        <fieldset name="customer">
            <field name="customer_type" xsi:type="filterable" dataType="int"/>

You need to use is_used_in_grid as true while creating your customer attribute like below.

            'type' =>'varchar',
            'label' => 'Customer Type',
            'input' => 'text',
            'required' => false,
            'sort_order' => 101,
            'visiable' => true,
            'position' => 101,
            'system' =>  false,
            'unique' => true,
            'is_used_in_grid' => true,
            'is_visible_in_grid' => false,
            'is_filterable_in_grid' => false,
            'is_searchable_in_grid' => false,


If you have already created this attribute and need to change the value then you can follow the below steps:

Step 1:

Goto eav_attribute table and search your attribute code customer_type in the column attribute_code. You will get the attribute_id.

Step 2:

Goto customer_eav_attribute table and search the row with attribute_id which you get from step 1.

Step 3:

Now update the columns is_used_in_grid , is_visible_in_grid , is_filterable_in_grid and is_searchable_in_grid to 1.

Step 4:

Flush the cache and run reindex and check.

  • It is already set as you said in db. Sep 12, 2018 at 8:47
  • Can you take screenshot of the table and update to your question? Sep 12, 2018 at 8:48

This error mostly arise when your is_used_in_grid , is_visible_in_grid , is_filterable_in_grid and is_searchable_in_grid are not set to 1 in customer_eav_attribute table.

After updating values please add code in the indexer.xml file.

Check code at https://github.com/rashigoyal14/main.git and download zip file named Createaccount.zip

Here telephone is the name of the customer_entity mentioned in InstallData.php file.

Run command : php bin/magento setup:upgrade php bin/magento s:s:d -f php bin/magento indexer:reindex php bin/magento cache:clean

Check your customer_grid_flat table. Your custom attribute must be there Thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.