无法在 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'
);
这将解决您的问题
此致
我正在尝试使用安装模式创建 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'
);
这将解决您的问题
此致