我有简单的 Laravel 迁移文件,指定了复合主键:
// ...
public function up()
{
Schema::create('my_super_long_table_name', function($table)
{
$table->integer('column_1');
$table->integer('column_2');
$table->integer('column_3');
$table->primary(['column_1', 'column_2', 'column_3']);
});
}
// ...
运行时
php artisan migrate
会抛出此错误:
SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'my_super_long_table_name_column_1_column_2_column_3' is too long
创建时只需指定键名(第二个参数为
primary
)。
$table->primary(['column_1', 'column_2', 'column_3'], 'my_long_table_primary');
接下来,
如果修改后出现类似
You have an error in your SQL syntax ...
的错误,请确保您的键名没有使用数据库引擎的保留字。
例如MySQL:http://dev.mysql.com/doc/refman/5.6/en/reserved-words.html
提示:
primary
是保留的,所以不要使用它;)
这就是解决方案:更改列的排序规则名称
public function up()
{
Schema::create('my_super_long_table_name', function($table)
{
$table->integer('column_1')->collation('utf8_general_mysql500_ci');
$table->integer('column_2')->collation('utf8_general_mysql500_ci');
$table->integer('column_3')->collation('utf8_general_mysql500_ci');
$table->primary(['column_1', 'column_2', 'column_3']);
});
}