Có một số vấn đề cần lưu ý với câu trả lời ở đây:
1) INFORMATION_SCHEMA.TABLES
không không bao gồm các bảng TẠM.
2) Sử dụng bất kỳ loại SHOW
truy vấn nào, nghĩa là SHOW TABLES LIKE 'test_table'
, sẽ trả lại kết quả cho máy khách, đây là hành vi không mong muốn để kiểm tra xem bảng có tồn tại phía máy chủ hay không, từ bên trong một thủ tục được lưu trữ cũng trả về kết quả.
3) Như một số người dùng đã đề cập, bạn phải cẩn thận với cách bạn sử dụng SELECT 1 FROM test_table LIMIT 1
.
Nếu bạn làm một cái gì đó như:
SET @table_exists = 0;
SET @table_exists = (SELECT 1 FROM test_table LIMIT 1);
Bạn sẽ không nhận được kết quả như mong đợi nếu bảng không có hàng.
Dưới đây là một quy trình được lưu trữ sẽ hoạt động cho tất cả các bảng (thậm chí TẠM THỜI).
Nó có thể được sử dụng như:
SET @test_table = 'test_table';
SET @test_db = NULL;
SET @does_table_exist = NULL;
CALL DoesTableExist(@test_table, @test_db, @does_table_exist);
SELECT @does_table_exist;
Mật mã:
/*
p_table_name is required
p_database_name is optional
if NULL is given for p_database_name, then it defaults to the currently selected database
p_does_table_exist
The @variable to save the result to
This procedure attempts to
SELECT NULL FROM `p_database_name`.`p_table_name` LIMIT 0;
If [SQLSTATE '42S02'] is raised, then
SET p_does_table_exist = 0
Else
SET p_does_table_exist = 1
Info on SQLSTATE '42S02' at:
https://dev.mysql.com/doc/refman/5.7/en/server-error-reference.html#error_er_no_such_table
*/
DELIMITER $$
DROP PROCEDURE IF EXISTS DoesTableExist
$$
CREATE PROCEDURE DoesTableExist (
IN p_table_name VARCHAR(64),
IN p_database_name VARCHAR(64),
OUT p_does_table_exist TINYINT(1) UNSIGNED
)
BEGIN
/* 793441 is used in this procedure for ensuring that user variables have unique names */
DECLARE EXIT HANDLER FOR SQLSTATE '42S02'
BEGIN
SET p_does_table_exist = 0
;
END
;
IF p_table_name IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DoesTableExist received NULL for p_table_name.';
END IF;
/* redirect resultset to a dummy variable */
SET @test_select_sql_793441 = CONCAT(
"SET @dummy_var_793441 = ("
" SELECT"
" NULL"
" FROM ",
IF(
p_database_name IS NULL,
"",
CONCAT(
"`",
REPLACE(p_database_name, "`", "``"),
"`."
)
),
"`",
REPLACE(p_table_name, "`", "``"),
"`"
" LIMIT 0"
")"
)
;
PREPARE _sql_statement FROM @test_select_sql_793441
;
SET @test_select_sql_793441 = NULL
;
EXECUTE _sql_statement
;
DEALLOCATE PREPARE _sql_statement
;
SET p_does_table_exist = 1
;
END
$$
DELIMITER ;