1
votes

Impossible de modifier le type de colonne de la table Laravel

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 COLLATE utf8mb4_unicode_ci )

Toute aide / astuce serait appréciée.


8 commentaires

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. Comme CHARACTER SET utf8mb4 comme indiqué dans votre erreur


Sinon, 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)


3 Réponses :


0
votes

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);
});


4 commentaires

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



3
votes

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;');
}


0 commentaires

0
votes

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


0 commentaires