Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Kiểm tra bảng tồn tại trong MySQL và hiển thị cảnh báo?

Giải pháp: CREATE TABLE IF NOT EXISTS

Tạo bảng chỉ khi chưa tồn tại, trả về warning nếu đã có.

Ví dụ minh họa

Tạo bảng lần 1

mysql> CREATE TABLE IF NOT EXISTS DemoTable (Id INT);
Query OK, 0 rows affected (0.71 sec)

Tạo lại bảng đã tồn tại

mysql> CREATE TABLE IF NOT EXISTS DemoTable (Id INT);
Query OK, 0 rows affected, 1 warning (0.06 sec)

Xem warning

mysql> SHOW WARNINGS;
+-------+------+-------------------------------------+
| Level | Code | Message                             |
+-------+------+-------------------------------------+
| Note  | 1050 | Table 'DemoTable' already exists    |
+-------+------+-------------------------------------+

Các cách kiểm tra khác

1. INFORMATION_SCHEMA (Chuẩn SQL)

SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'DemoTable';

2. SHOW TABLES

SHOW TABLES LIKE 'DemoTable';

3. DROP IF EXISTS + CREATE (Reset bảng)

DROP TABLE IF EXISTS DemoTable;
CREATE TABLE DemoTable (Id INT);

Ứng dụng thực tế: Migration/Deployment

-- Tạo bảng nếu chưa có
CREATE TABLE IF NOT EXISTS users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Thêm cột nếu chưa có (MySQL 8.0+)
ALTER TABLE users ADD COLUMN IF NOT EXISTS phone VARCHAR(20);

Lưu ý

  • IF NOT EXISTS chỉ kiểm tra tên bảng, không kiểm tra cấu trúc
  • Nếu bảng tồn tại nhưng schema khác → không báo lỗi, không thay đổi
  • Warning level = Note (không phải Error)
  • Dùng SHOW WARNINGS ngay sau câu lệnh để xem

Kiểm tra và tạo index nếu chưa có (MySQL 8.0+)

-- Không có cú pháp IF NOT EXISTS cho INDEX
-- Cần kiểm tra thủ tục:
SELECT COUNT(*) INTO @idx_exists 
FROM INFORMATION_SCHEMA.STATISTICS 
WHERE TABLE_SCHEMA = DATABASE() 
  AND TABLE_NAME = 'users' 
  AND INDEX_NAME = 'idx_email';

SET @sql = IF(@idx_exists = 0, 'CREATE INDEX idx_email ON users(email)', 'SELECT "Index exists"');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;