mysql - guia - qgis manual
Verifique si la tabla existe sin usar "seleccionar de" (11)
Aquí hay una tabla que no es SELECCIONADA * FROM
SHOW TABLES FROM `db` LIKE ''tablename''; //zero rows = not exist
Obtuve esto de una base de datos profesional, esto es lo que me dijeron:
select 1 from `tablename`; //avoids a function call
select * from IMFORMATION_SCHEMA.tables where schema = ''db'' and table = ''table'' // slow. Field names not accurate
SHOW TABLES FROM `db` LIKE ''tablename''; //zero rows = not exist
¿Hay alguna manera de verificar si existe una tabla sin seleccionar y verificar valores de ella?
Es decir, sé que puedo SELECT testcol FROM testtable
y verificar el recuento de campos devueltos, pero parece que debe haber una forma más directa / elegante de hacerlo.
En lugar de confiar en los errores, puede consultar INFORMATION_SCHEMA para ver si existe la tabla. Si hay un registro, existe. Si no hay registro, no existe.
Ninguna de las opciones excepto SELECT no permite el nombre de la base de datos tal como se usa en SELECT, así que escribí esto:
SELECT COUNT(*) AS cnt FROM information_schema.TABLES
WHERE CONCAT(table_schema,".",table_name)="db_name.table_name";
No necesitas contar nada.
SELECT 1 FROM testtable LIMIT 1;
Si no hay error, la tabla existe.
O bien, si quiere estar en lo correcto, use INFORMATION_SCHEMA .
SELECT *
FROM information_schema.tables
WHERE table_schema = ''yourdb''
AND table_name = ''testtable''
LIMIT 1;
Alternativamente, puede usar SHOW TABLES
SHOW TABLES LIKE ''yourtable'';
Si hay una fila en el conjunto de resultados, la tabla existe.
Puede consultar la vista del sistema de tables
INFORMATION_SCHEMA:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = ''databasename''
AND table_name = ''testtable'';
Si no se devolvieron las filas, entonces la tabla no existe.
Puedes hacer algo como a continuación:
string strCheck = "SHOW TABLES LIKE /'tableName/'";
cmd = new MySqlCommand(strCheck, connection);
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
cmd.Prepare();
var reader = cmd.ExecuteReader();
if (reader.HasRows)
{
Console.WriteLine("Table Exist!");
}
else
{
Console.WriteLine("Table does not Exist!");
}
Solo para agregar una forma adicional de hacerlo, y dependiendo de lo que necesite, podría usar un handler para el error er_no_such_table : 1146 así:
DELIMITER ;;
CREATE PROCEDURE `insert_in_my_table`(in my_var INT)
BEGIN
-- Error number for table not found
DECLARE CONTINUE HANDLER FOR 1146
BEGIN
-- table doesn''t exists, do something...
CREATE TABLE my_table(n INT);
INSERT INTO my_table (n) values(my_var);
END;
-- table does exists, do something...
INSERT INTO my_table (n) values(my_var);
END ;;
DELIMITER ;
Una comparación de rendimiento:
- MySQL 5.0.77, en un db que tiene alrededor de 11,000 tablas.
- Seleccionar una tabla no usada recientemente para que no esté almacenada en caché.
- Promedió más de 10 intentos cada uno. (Nota: hecho con diferentes tablas para evitar el almacenamiento en caché).
322ms: show tables like ''table201608'';
691ms: select 1 from table201608 limit 1;
319ms: SELECT count(*) FROM information_schema.TABLES WHERE (TABLE_SCHEMA = ''mydb'') AND (TABLE_NAME = ''table201608'');
Tenga en cuenta que si ejecuta esto mucho, como en muchas solicitudes de HTML en un período corto, el segundo será mucho más rápido, ya que se almacenará en caché un promedio de 200 ms o más rápido.
Yo uso esto en php.
private static function ifTableExists(string $database, string $table): bool
{
$query = DB::select("
SELECT
IF( EXISTS
(SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ''$database''
AND TABLE_NAME = ''$table''
LIMIT 1),
1, 0)
AS if_exists
");
return $query[0]->if_exists == 1;
}
mostrar tablas como ''table_name''
si esto devuelve filas> 0, la tabla existe
SELECT count(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = ''your_db_name'') AND (TABLE_NAME = ''name_of_table'')
si obtienes un recuento distinto de cero, la tabla existe.