无法在 magento 2 中创建 table

unable to create a table in magento 2

我正在尝试使用安装模式创建 table,但它抛出了下面给出的错误 正在安装模式... SQLSTATE [HY000]:一般错误:1005 无法创建 table magento.questionanswer(错误号:150 "Foreign key constraint is incorrectly formed"),查询为:CREATE TABLE 如果不存在 questionanswer ( question_id int NULL COMMENT 'Question ID' , answer_id int NULL COMMENT 'Answer ID' , 主键 (question_id, answer_id), 索引 QUESTIONANSWER_ANSWER_ID (answer_id), 在删除级联时约束 QUESTIONANSWER_QUESTION_ID_FAQQUESTION_QUESTION_ID 外键 (question_id) 引用 faqquestion (question_id), 在删除级联时约束 QUESTIONANSWER_ANSWER_ID_FAQANSWER_ANSWER_ID 外键 (answer_id) 引用 faqanswer (answer_id) ) COMMENT='问题回答链接Table' ENGINE=INNODB charset=utf8 COLLATE=utf8_general_ci.

我的 table 的 installschema 代码是

        //      Creating Question table
    $table = $installer->getConnection()->newTable(
        $installer->getTable('faqquestion')
    )->addColumn(
        'question_id',
        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
        null,
        ['nullable' => false, 'primary' => true],
        'Question ID'
    )->addColumn(
        'question',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        '2M',
        ['nullable' => true,'default' => null],
        'Question'
    )->addColumn(
        'question_identifier',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        255,
        ['nullable' => true],
        'Identifier'
    )->addColumn(
        'question_topic',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        255,
        ['nullable' => true],
        'Topic'
    )->addColumn(
        'question_sortorder',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'SortOrder'
    )->addColumn(
        'question_status',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'Question Status'
    )->addColumn(
        'question_visibility',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'Question Visibility'
    )->addColumn(
        'question_tags',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        255,
        ['nullable' => true],
        'Tags'
    )->setComment(
        'Question Table'
    );
    $installer->getConnection()->createTable($table);



    //creating answer table
    $table = $installer->getConnection()->newTable(
        $installer->getTable('faqanswer')
    )->addColumn(
        'answer_id',
        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
        null,
        ['nullable' => false, 'primary' => true],
        'Answer ID'
    )->addColumn(
        'answer',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        '2M',
        ['nullable' => true,'default' => null],
        'Answer'
    )->addColumn(
        'answer_likes',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'Likes'
    )->addColumn(
        'answer_dislikes',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'Dislikes'
    )->addColumn(
        'answer_author',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        255,
        ['nullable' => true],
        'Author'
    )->addColumn(
        'answer_status',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        1,
        ['nullable' => false,'default' => 0],
        'Answer Status'
    )->setComment(
        'Answer table'
    );
    $installer->getConnection()->createTable($table);

//        queston and related answer table
    $table = $installer->getConnection()->newTable(
        $installer->getTable('questionanswer')
    )->addColumn(
        'question_id',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        null,
        ['nullable' => true, 'primary' => true],
        'Question ID'
    )->addColumn(
        'answer_id',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        null,
        ['nullable' => true, 'primary' => true],
        'Answer ID'
    )->addIndex(
        $installer->getIdxName('questionanswer', ['answer_id']),
        ['answer_id']
    )->addForeignKey(
        $installer->getFkName('questionanswer', 'question_id', 'faqquestion', 'question_id'),
        'question_id',
        $installer->getTable('faqquestion'),
        'question_id',
        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
    )->addForeignKey(
        $installer->getFkName('questionanswer', 'answer_id', 'faqanswer', 'answer_id'),
        'answer_id',
        $installer->getTable('faqanswer'),
        'answer_id',
        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
    )->setComment(
        ' Question to aNswer Linkage Table'
    );
    $installer->getConnection()->createTable($table);

因为列类型不匹配。如我所见 question_id 和 answer_id 在参考表中有 TYPE_SMALLINT 但在问题答案中你创建了 TYPE_INTEGER而不是那个。所以要解决这个问题,只需要将 TYPE_INTEGER 更改为 TYPE_SMALLINT,问题答案将是这样的:

$table = $installer->getConnection()->newTable(
            $installer->getTable('questionanswer')
        )->addColumn(
            'question_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
            null,
            ['nullable' => false, 'primary' => true],
            'Question ID'
        )->addColumn(
            'answer_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
            null,
            ['nullable' => false, 'primary' => true],
            'Answer ID'
        )->addIndex(
            $installer->getIdxName('questionanswer', ['answer_id']),
            ['answer_id']
        )->addForeignKey(
            $installer->getFkName('questionanswer', 'question_id', 'faqquestion', 'question_id'),
            'question_id',
            $installer->getTable('faqquestion'),
            'question_id',
            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
        )->addForeignKey(
            $installer->getFkName('questionanswer', 'answer_id', 'faqanswer', 'answer_id'),
            'answer_id',
            $installer->getTable('faqanswer'),
            'answer_id',
            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
        )->setComment(
            ' Question to aNswer Linkage Table'
        );

这将解决您的问题

此致