यहाँ उत्तर के साथ ध्यान देने योग्य कई मुद्दे हैं:
1) नहींINFORMATION_SCHEMA.TABLES
करता है अस्थायी तालिकाओं में शामिल हैं।
2) किसी भी प्रकार के SHOW
क्वेरी का उपयोग करना , अर्थातSHOW TABLES LIKE 'test_table'
, एक परिणामी ग्राहक को वापस लौटने के लिए मजबूर करेगा, जो जाँच के लिए अवांछित व्यवहार है कि क्या एक तालिका सर्वर-साइड में मौजूद है, एक संग्रहीत प्रक्रिया के भीतर से जो एक परिणाम भी देता है।
3) जैसा कि कुछ उपयोगकर्ताओं ने उल्लेख किया है, आपको सावधान रहना होगा कि आप कैसे उपयोग करते हैं SELECT 1 FROM test_table LIMIT 1
।
यदि आप कुछ ऐसा करते हैं:
SET @table_exists = 0;
SET @table_exists = (SELECT 1 FROM test_table LIMIT 1);
यदि तालिका में शून्य पंक्तियाँ हैं, तो आपको अपेक्षित परिणाम नहीं मिलेगा।
नीचे एक संग्रहीत कार्यविधि है जो सभी तालिकाओं (यहां तक कि मंदिर) के लिए काम करेगी ।
इसका उपयोग इस तरह किया जा सकता है:
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;
कोड:
/*
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 ;