MeWrite Docs

Table 'database.table' doesn't exist

指定されたテーブルが存在しない場合に発生するエラー

概要

Table 'database.table' doesn't exist は、MySQLで存在しないテーブルにアクセスしようとした場合に発生するエラーです。テーブル名のスペルミス、マイグレーション未実行、データベースの選択ミスなどが原因です。

エラーメッセージ

ERROR 1146 (42S02): Table 'mydb.users' doesn't exist
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mydb.users' doesn't exist

原因

  1. テーブル名のスペルミス: テーブル名が間違っている
  2. マイグレーション未実行: テーブルがまだ作成されていない
  3. データベースの選択ミス: 違うデータベースを参照している
  4. 大文字小文字の違い: Linux環境では大文字小文字を区別
  5. テーブルが削除された: 誤って削除された

解決策

1. テーブルの存在確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- データベース内のテーブル一覧
SHOW TABLES;

-- 特定のテーブルを検索
SHOW TABLES LIKE '%user%';

-- テーブルの詳細情報
DESCRIBE users;

-- 現在のデータベースを確認
SELECT DATABASE();

2. 正しいデータベースを選択

1
2
3
4
5
6
7
8
-- データベース一覧
SHOW DATABASES;

-- データベースを選択
USE correct_database;

-- テーブルを確認
SHOW TABLES;

3. Laravel マイグレーションの実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# マイグレーション状態を確認
php artisan migrate:status

# マイグレーションを実行
php artisan migrate

# 特定のマイグレーションを実行
php artisan migrate --path=/database/migrations/2025_01_01_000000_create_users_table.php

# マイグレーションをリセットして再実行
php artisan migrate:fresh  # 全テーブル削除後に実行

# シーダーも一緒に実行
php artisan migrate:fresh --seed

4. テーブル名の大文字小文字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- Linux では大文字小文字を区別
-- Windows/macOS では区別しない場合がある

-- 設定を確認
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 0: 大文字小文字を区別(Linux デフォルト)
-- 1: 小文字に統一(Windows デフォルト)
-- 2: 保存時は元のまま、比較時は小文字

-- テーブル名を確認
SHOW TABLES;
1
2
3
4
5
// Laravel でテーブル名を明示
class User extends Model
{
    protected $table = 'users';  // テーブル名を明示
}

5. テーブルを手動で作成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-- テーブルを作成
CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL
);

-- テーブルが作成されたか確認
SHOW TABLES;
DESCRIBE users;

6. バックアップから復元

1
2
3
4
5
# ダンプファイルから復元
mysql -u username -p database_name < backup.sql

# 特定のテーブルのみ復元
mysql -u username -p database_name < users_table.sql

7. Laravel でテーブル存在確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use Illuminate\Support\Facades\Schema;

// テーブルの存在確認
if (Schema::hasTable('users')) {
    // テーブルが存在する
}

// カラムの存在確認
if (Schema::hasColumn('users', 'email')) {
    // カラムが存在する
}

8. 複数データベース環境での確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// .env
DB_CONNECTION=mysql
DB_DATABASE=main_database

// config/database.php で複数接続を定義
'connections' => [
    'mysql' => [
        'database' => env('DB_DATABASE', 'main_database'),
    ],
    'secondary' => [
        'database' => env('DB_SECONDARY_DATABASE', 'other_database'),
    ],
],

// モデルで接続を指定
class Report extends Model
{
    protected $connection = 'secondary';
    protected $table = 'reports';
}

9. ビューの確認

1
2
3
4
5
6
-- ビューも同じエラーが出る場合がある
SHOW FULL TABLES WHERE Table_Type = 'VIEW';

-- ビューを作成
CREATE VIEW user_summary AS
SELECT id, name, email FROM users;

Docker 環境での確認

1
2
3
4
5
6
7
# コンテナ内でMySQLに接続
docker exec -it mysql_container mysql -u root -p

# データベースとテーブルを確認
SHOW DATABASES;
USE your_database;
SHOW TABLES;
1
2
3
4
5
6
7
# docker-compose.yml でボリュームを確認
services:
  db:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql  # データ永続化
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # 初期化SQL

デバッグのコツ

クエリのログを確認

1
2
3
4
5
6
-- 一般クエリログを有効化
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';

-- ログを確認
SHOW VARIABLES LIKE 'general_log%';

Laravel でクエリを確認

1
2
3
4
5
6
7
8
// クエリログを有効化
DB::enableQueryLog();

// クエリを実行
$users = User::all();

// 実行されたクエリを確認
dd(DB::getQueryLog());
1
2
3
4
5
// クエリをリアルタイムで出力
DB::listen(function ($query) {
    dump($query->sql);
    dump($query->bindings);
});

MySQL の他のエラー

最終更新: 2025-12-08