Je ne peux pas exécuter migrate: fresh.
La commande échoue lors du changement de colonne de table de:
$table->integer('language_id')->unsigned()->default(1)->change();
à:
$table->string('language_id')->default('')->length(255);
Erreur que j'obtiens:
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de 'CHARACTER SET utf8mb4 DEFAULT 1 NOT N ULL COLLATE
utf8mb4_unicode_ci
'à la ligne 1 (SQL: ALTER TABLE users CHANGE language_id language_id INT UNSIGNED CHA RACTER SET utf8mb4 DEFAULT 1 NOT NULL COLLATEutf8mb4_unicode_ci
)
Toute aide / astuce serait appréciée.
3 Réponses :
En fonction de la documentation Laravel:
Remarque: avant de modifier une colonne, assurez-vous d'ajouter la dépendance doctrine / dbal à votre fichier composer.json.
Essayez ceci
Schema::table('your_table_name', function (Blueprint $table) { $table->unsignedInteger('language_id')->default(1); });
Je ne peux pas supprimer la colonne, car je dois changer le type de colonne sans perdre aucune valeur stockée dans la table
Ok essayez sans laisser tomber la colonne
doctrine / dbal est inclus dans composer, et sans supprimer la colonne, la même erreur s'est produite
Peut-être avez-vous déjà des chaînes dans votre base de données? Et vous voulez changer le thème en Integer, c'est pourquoi vous avez cette erreur
Si la solution standard ne fonctionne pas. Vous pouvez essayer ceci:
public function up() { DB::statement('ALTER TABLE mytable MODIFY mycolumn INTEGER;'); } public function down() { DB::statement('ALTER TABLE mytable MODIFY mycolumn STRING;'); }
Besoin de doctrine / dbal
public function up() { Schema::table('table_name', function (Blueprint $table) { $table->integer('language_id')->change(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('your_table_name', function (Blueprint $table) { $table->dropColumn('language_id'); }); }
écrire une nouvelle migration et écrire ceci
composer require doctrine/dbal
Essayez d'abord de le définir sur
integer
, puis définissez la valeur par défaut ou vice versa@ege la même erreur est apparue après le passage à
$ table-> integer ('language_id') -> default (1) -> unsigned () -> chan ge ();
Je voulais dire que vous passez de
string
àinteger
. Vous devez peut-être supprimer certains attributs de ce champ avant de le modifier. CommeCHARACTER SET utf8mb4
comme indiqué dans votre erreurSinon, créez une nouvelle colonne. Migrez-y toutes vos données reformatées , puis supprimez l'ancienne colonne et renommez la colonne actuelle
@ege c'est une solution appropriée, mais le cas actuel ne me permet pas de le faire. Changer la chaîne en unsigned int est le problème.
bien. Que diriez-vous de ceci: essayez de le changer en utilisant phpmyadmin ou similaire copiez les requêtes SQL qu'il utilise et utilisez
DB :: raw ($ query)
pour l'ajouter à un fichier de migration. C'est laborieux, mais cela pourrait révéler quel est le problème.Avez-vous trouvé une solution pour cela? Nous avons exactement le même problème.
La solution de travail temporaire @larsemil pour mon cas était de la laisser sous forme de chaîne et d'utiliser les valeurs 1/0 pour le champ désigné afin que je puisse le traiter comme un entier non signé, car je n'ai pas pu supprimer la colonne car elle était remplie avec des données. Peut-être que l'écriture d'une migration personnalisée qui extraira les données de l'ancienne ligne de table et recréera la ligne de table de la bonne manière pourrait être une solution (assurez-vous d'abord de sauvegarder la base de données)