Ada beberapa masalah yang perlu diperhatikan dengan jawaban di sini:
1) INFORMATION_SCHEMA.TABLES
tidak tidak termasuk tabel SEMENTARA.
2) Menggunakan segala jenis SHOW
permintaan, yaituSHOW TABLES LIKE 'test_table'
, akan memaksa pengembalian set hasil ke klien, yang merupakan perilaku yang tidak diinginkan untuk memeriksa apakah tabel ada di sisi server, dari dalam prosedur tersimpan yang juga mengembalikan set hasil.
3) Seperti yang disebutkan beberapa pengguna, Anda harus berhati-hati dengan cara Anda menggunakannya SELECT 1 FROM test_table LIMIT 1
.
Jika Anda melakukan sesuatu seperti:
SET @table_exists = 0;
SET @table_exists = (SELECT 1 FROM test_table LIMIT 1);
Anda tidak akan mendapatkan hasil yang diharapkan jika tabel memiliki nol baris.
Di bawah ini adalah prosedur tersimpan yang akan bekerja untuk semua tabel (bahkan SEMENTARA).
Dapat digunakan seperti:
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;
Kode:
/*
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 ;