[RESOLVIDO] Laravel - Erro ao Gerar Segunda Tabela (Oracle MySQL e MariaDB)

Considerando que tentei com as foreign keys e sem, o quê tem de errado nas migrations , que não gera a segunda tabela, postagens?

Saída no terminal:

php artisan migrate

Migrating: 2019_01_17_164906_create_usuarios_table

Illuminate\Database\QueryException : SQLSTATE[42S01]: Base table or view already > exists: 1050 Table 'usuarios' already exists (SQL: create tableusuarios(idint unsigned not null auto_increment primary key,postagem_idint unsigned not null,emailvarchar(191) not null,senhavarchar(191) not null,imagemvarchar(100) null,nomevarchar(30) not null,sobrenomevarchar(50) not null,idadeint not null,estadoenum('Acre', 'Alagoas', 'Amapá', 'Amazonas', 'Bahia', 'Ceará', 'Distrito Federal', 'Espírito Santo', 'Goiás', 'Maranhão', 'Mato Grosso', 'Mato Grosso do Sul', 'Minas Gerais', 'Pará', 'Paraíba', 'Paraná', 'Pernambuco', 'Piauí', 'Rio de Janeiro', 'Rio Grande do Norte', 'Rio Grande do Sul','Rondônia', 'Roraima', 'Santa Catarina', 'São Paulo', 'Sergipe', 'Tocantins') not null,created_attimestamp null,updated_attimestamp null,deleted_at` timestamp null) default character set utf8mb4 collate ‘utf8mb4_unicode_ci’)

at /opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
660| // If an exception occurs when attempting to run a query, we’ll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database’s errors.
663| catch (Exception $e) {
664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|`

Exception trace:

PDOException::(“SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘usuarios’ already exists”) /opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458
PDOStatement::execute() /opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458
Please use the argument -v to see more details.
leandro@leandro-B85M-D3PH:/opt/lampp/htdocs/utilitarios$

Ele está dizendo que a tabela já existe, por experiência própria você deveria reiniciar todo o seu banco, ou então excluir as tabelas envolvidas e tentar rodar novamente a migration.

Porque aconteceu isso?
Você rodou a migration, ai ela criou a tabela, mas, deu erro em algum outra parte e por isso não foi totalmente completada e com isso se rodar novamente é conferido que o arquivo ainda não foi executado e por isso dá a mensagem de tabela já criada!

Olhando a suas Migrations
Se fez errado a ordem de precedência, ou seja, a tabela usuário foi criada primeiro do que a tabela postagem, e com isso dá erro mesmo.

é como eu disse deve ser criado essas duas migrations corretamente, e aquela que leva a chave da outra é criado posteriormente.

Isso é Banco de dados relacional.

1 curtida

Bom dia LeandroCGMS, o @Dragoon entrou de sola e detonou de cara a solução. Se resolveu, que com certeza resolveu fecha o tópico e marca a resposta dele como solução
Abraços
Max

Depois de excluir todas as tabelas geradas nesse banco de dados e refazer as tabelas, a saída do terminal é:

php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrating: 2019_01_17_164906_create_usuarios_table

Erro:

Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1005 Can’t create table utilitarios.#sql-1050_6 (errno: 150 “Foreign key constraint is incorrectly formed”) (SQL: alter table usuarios add constraint usuarios_postagem_id_foreign foreign key (postagem_id) references postagens (id) on delete cascade)

at /opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
660| // If an exception occurs when attempting to run a query, we’ll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database’s errors.
663| catch (Exception $e) {

664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|

Exception trace:

1 PDOException::(“SQLSTATE[HY000]: General error: 1005 Can’t create table utilitarios.#sql-1050_6 (errno: 150 “Foreign key constraint is incorrectly formed”)”)
/opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

2 PDOStatement::execute()
/opt/lampp/htdocs/utilitarios/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

Bom o resumo é que suas migrations estão erradas e como não sabemos o modelo MER, fica complicado apontar o problema.

Como estou testando algo para um site, coloquei poucos dados a serem entrados pelos usuários na tabela de mesmo nome e terá relação com a tabela postagem e vice-versa, não passa de 7 campos. Veja as migrations usuarios e postagens:

As suas migrations, estão erradas, eu “acho” que você quer um relacionamento muitos para muitos, mas, é achismo, mas, as sua migrations não podem relacionar tabelas que ainda não existem, precisa ser criada uma próxima migration só com as relações entre as duas tabelas, porque ai pelo menos elas existem, mas, mesmo assim prevejo problemas conceituais.

  • Você poderia dizer o que quer fazer?
  • Tem alguma regra de negócio, um estudo, uma analise?

Não consigo ver o que pretende fazer.

Bom dia. Um usuário pode ter nenhuma ou muitas postagens, uma postagem tem apenas um usuário, o que pode ou não ser necessário, na tratativa da página em que o usuário irá postar.
O problema é que não colocando chave estrangeira na tabela postagem, o erro permanece.
É como por não ter a tabela postagem ainda, ele não aceitar a criação. É isso?

Sua relação 1 para muitos, onde usuário pode ter uma, nenhuma ou várias postagens.

Então para uma postagem existir precisa ter um usuário, então crie a tabela de usuário que não tem as chaves da postagem, e depois crie a tabela postagem relacionado com a chave primária de usuário, essa é a lógica.

Mais ou menos assim:

Primeiro migration a ser criado: usuarios:

<?php
	use Illuminate\Support\Facades\Schema;
	use Illuminate\Database\Schema\Blueprint;
	use Illuminate\Database\Migrations\Migration;
	class CreateUsuariosTable extends Migration
	{    
		public function up()
		{
			Schema::create('usuarios', function (Blueprint $table) {
				$table->increments('id');            
				$table->string('email')->unique();
				$table->string('senha');
				$table->string('imagem', 100)->nullable();
				$table->string('nome', 30);
				$table->string('sobrenome', 50);
				$table->integer('idade');
				$table->enum('estado',[
				'Acre',
				'Alagoas',
				'Amapá',
				'Amazonas',
				'Bahia',
				'Ceará',
				'Distrito Federal',
				'Espírito Santo',
				'Goiás',
				'Maranhão',
				'Mato Grosso',
				'Mato Grosso do Sul',
				'Minas Gerais',
				'Pará',
				'Paraíba',
				'Paraná',
				'Pernambuco',
				'Piauí',
				'Rio de Janeiro',
				'Rio Grande do Norte',
				'Rio Grande do Sul',
				'Rondônia',
				'Roraima',
				'Santa Catarina',
				'São Paulo',
				'Sergipe',
				'Tocantins'
				]);
				$table->timestamps();
				$table->softDeletes();
			});
		}
		public function down()
		{
			Schema::dropIfExists('usuarios');
		}
}

Depois o próximo migration a ser criado postagem:

<?php
	use Illuminate\Support\Facades\Schema;
	use Illuminate\Database\Schema\Blueprint;
	use Illuminate\Database\Migrations\Migration;
	class CreatePostagensTable extends Migration
	{		
		public function up()
		{
			Schema::create('postagens', function (Blueprint $table) {
				$table->increments('id');
				$table->string('conteudo');
				$table->integer('usuario_id')->unsigned();
				$table->foreign('usuario_id')->references('id')->on('usuarios');
				$table->timestamps();
			});
		}
		public function down()
		{
			Schema::dropIfExists('postagens');
		}
}
2 curtidas

Eu prefiro a chave estrangeira na tabela usuários, mas funcionou e tanto o que prefiro quanto isso já serve de recurso na lógica de programação.
Será que pra isso, bastaria criar a migration postagens antes da usuarios?

Eu prefiro a chave estrangeira na tabela usuários:

Não é preferencia, é lógica de um Modelo Entidade Relacionamento, se fizer assim está errado. Estude MER antes de dizer isso.

Será que pra isso, bastaria criar a migration postagens antes da usuarios?

Se utilizar a migration corretamente não … primeiro usuário depois postagem

1 curtida

Eu devo estar misturando alguma aula de MongoDB com MER. Já estou revendo esses conceitos.

1 curtida