2 votes

Le Constructeur de Schéma Laravel ajoute l'auto_increment à tous les champs entiers, ce qui le fait échouer

Lorsque j'essaie d'utiliser la migration de la base de données PHP Laravel et le générateur de schéma, je reçois toujours l'erreur ci-dessous sur toute table ayant une colonne ID avec incrémentation automatique et une colonne user_id entière régulière.

L'erreur ci-dessous montre que la colonne user_id SQL est générée avec la valeur auto_increment sur le user_id et mon code ne lui demande pas de le faire nulle part!

Je suis en train d'utiliser Laravel v5.3

Mon code de schéma est :

public function up()
{
    Schema::create('bookmark_tag_lists', function(Blueprint $table)
    {
        $table->increments('id', 10);
        $table->string('title', 100)->nullable();
        $table->string('slug', 100)->nullable();
        $table->text('description', 65535)->nullable();
        $table->string('list_icon', 200)->nullable();
        $table->text('tags', 65535)->nullable();
        $table->integer('user_id', 10)->unsigned();
        $table->dateTime('created_on');
        $table->dateTime('modified_on');
        $table->integer('parent')->default(0);
        $table->string('breadcrumb_path')->nullable();
        $table->integer('tag_count')->default(0);
        $table->integer('bookmark_count')->default(0);
        $table->integer('sort')->default(0);
        $table->integer('active')->default(1);
    });
}

Erreur de base de données

[Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table def
  inition; there can be only one auto column and it must be defined as a key
  (SQL: create table `bookmark_tag_lists` (`id` int unsigned not null auto_in
  crement primary key, `title` varchar(100) null, `slug` varchar(100) null, `
  description` text null, `list_icon` varchar(200) null, `tags` text null, `u
  ser_id` int unsigned not null auto_increment primary key, `created_on` date
  time not null, `modified_on` datetime not null, `parent` int not null defau
  lt '0', `breadcrumb_path` varchar(255) null, `tag_count` int not null defau
  lt '0', `bookmark_count` int not null default '0', `sort` int not null defa
  ult '0', `active` int not null default '1') default character set utf8 coll
  ate utf8_unicode_ci)

  [Doctrine\DBAL\Driver\PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table def
  inition; there can be only one auto column and it must be defined as a key

3voto

Mikhail.root Points 379

Salut, voici probablement une solution. Regardons cette ligne qui définit la valeur user_id.

$table->integer('user_id', 10)->unsigned();

Je pense que tu voulais dire que tu as besoin d'un entier non signé sur 10 octets en écrivant ceci, mais il y a une chose à savoir sur le type de champ integer dans Laravel 5.3. Regardons la définition de cette méthode, elle attend jusqu'à 3 paramètres à passer :

      public function Blueprint::integer($column, $autoIncrement = false, $unsigned = false) Illuminate\Support\Fluent 

      Crée une nouvelle colonne integer (4 octets) dans la table.
      Paramètres : 
      string $column
      bool $autoIncrement
      bool $unsigned

Donc en passant 10 cela le convertit en boolean et le rend vrai, c'est pourquoi il te dit que tu essaies de créer plus d'un champ auto-incrémenté !

Enfin la solution est :

    $table->integer('user_id', false,true);

avec ceci tu demandes de ne pas créer de champ auto-incrémenté mais toujours non signé comme tu le souhaites. Mais cela crée un entier non signé sur 4 octets avec cela donc. Il y a même une meilleure solution :

   $table->bigInteger('user_id',false,true);

Cela crée un champ non auto-incrémenté sur 8 octets non signé dans la base de données.

J'espère que cela t'aidera.

1voto

mapmalith Points 399

Dans votre code, vous essayez de donner des tailles pour un entier ce qui conduit à l'erreur. Si vous modifiez le code suivant, vous n'obtiendrez pas la même erreur.

Changez cette ligne $table->integer('user_id', 10)->unsigned(); en $table->integer('user_id');

J'espère que cela vous aidera

0voto

jasondavis Points 11944

J'ai corrigé en ajoutant $table->index('user_id'); à mon constructeur de schéma de table tag_list

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X