"select from" 구문을 사용하지 않고 MySQL 테이블이 존재하는지 확인하시겠습니까?
테이블에서 값을 선택하고 확인하지 않고 테이블이 존재하는지 확인할 수 있는 방법이 있습니까?
즉, 나는 갈 수 있다는 것을 안다.SELECT testcol FROM testtable
반환되는 필드 수를 체크합니다만, 보다 직접적이고 우아한 방법이 있을 것 같습니다.
정확하게 하려면 INFORMATION_SCHEMA를 사용합니다.
SELECT *
FROM information_schema.tables
WHERE table_schema = 'yourdb'
AND table_name = 'testtable'
LIMIT 1;
또는 다음을 사용할 수 있습니다.SHOW TABLES
SHOW TABLES LIKE 'yourtable';
결과 세트에 행이 있으면 테이블이 존재합니다.
SELECT count(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = 'your_db_name') AND (TABLE_NAME = 'name_of_table')
카운트가 0이 아니면 테이블이 존재합니다.
퍼포먼스 비교:
- 약 11,000개의 테이블이 있는 DB의 MySQL 5.0.77.
- 캐시되지 않도록 최근에 사용되지 않은 테이블을 선택합니다.
- 각각 평균 10회 이상 시도(주의: 캐시를 피하기 위해 다른 테이블을 사용하여 수행됨).
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');
단기간에 많은 HTML 요청과 마찬가지로 이 작업을 많이 실행하는 경우 두 번째 요청은 평균 200밀리초 이상 캐시되므로 훨씬 더 빠릅니다.
위의 내용을 모두 읽은 후, 다음과 같은 문장이 좋습니다.
SELECT EXISTS(
SELECT * FROM information_schema.tables
WHERE table_schema = 'db'
AND table_name = 'table'
);
그것은 정확히 당신이 무엇을 하고 싶은지를 나타내며 실제로 '부울런'을 반환한다.
INFORMATION_SCHEMA를 조회할 수 있습니다.tables
시스템 뷰:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'testtable';
행이 반환되지 않으면 테이블이 존재하지 않습니다.
SELECT * FROM이 아닌 테이블입니다.
SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist
데이터베이스 프로로부터 얻은 정보입니다.다음은 제가 들은 이야기입니다.
select 1 from `tablename`; //avoids a function call
select * from INFORMATION_SCHEMA.tables where schema = 'db' and table = 'table' // slow. Field names not accurate
SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = does not exist
에러에 의존하지 않고 테이블이 존재하는지 쿼리할 수 있습니다.만약 기록이 있다면, 그건 존재하는 거야.기록이 없다면 존재하지 않는 거야
위에서 수정한 이 솔루션에는 현재 데이터베이스에 대한 명확한 지식이 필요하지 않습니다.그 후, 유연성이 높아집니다.
SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'yourtable'
AND TABLE_SCHEMA in (SELECT DATABASE());
'table_name'과 같은 테이블 표시
행 > 0 이 반환되는 경우 테이블은 존재합니다.
2019년 이후에 이 내용을 읽는다면 MySQL 5.7이 추가되었음을 참고하십시오.table_exists
TEMporary TABLES를 포함하여 테이블이 존재하는지 여부를 확인하는 절차입니다.
사용방법: @exist를 '', 'BASE TABLE', 'VIEW', 'TEMPOLY' 중 하나로 설정합니다.
CALL sys.table_exists('db1', 't3', @exists);
레퍼런스:
https://dev.mysql.com/doc/refman/5.7/en/sys-table-exists.html
다른 방법을 추가하는 것만으로, 필요에 따라서, er_no_such_table error:1146 에 대해서 핸들러를 사용할 수 있습니다.
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 ;
다음과 같은 작업을 수행할 수 있습니다.
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!");
}
이 답변을 확장하면 테이블 존재 여부에 따라 TRUE/FALSE를 반환하는 함수를 추가로 작성할 수 있습니다.
CREATE FUNCTION fn_table_exists(dbName VARCHAR(255), tableName VARCHAR(255))
RETURNS BOOLEAN
BEGIN
DECLARE totalTablesCount INT DEFAULT (
SELECT COUNT(*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = dbName COLLATE utf8_general_ci)
AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
);
RETURN IF(
totalTablesCount > 0,
TRUE,
FALSE
);
END
;
SELECT fn_table_exists('development', 'user');
이 콤팩트 메서드는 0이 있으면 1을 반환합니다(존재하지 않으면 0).
set @ret = 0;
SELECT 1 INTO @ret FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'my_table';
SELECT @ret;
mysql 함수에 넣을 수 있습니다.
DELIMITER $$
CREATE FUNCTION ExistTable (_tableName varchar(255))
RETURNS tinyint(4)
SQL SECURITY INVOKER
BEGIN
DECLARE _ret tinyint;
SET _ret = 0;
SELECT
1 INTO _ret
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = _tablename LIMIT 1;
RETURN _ret;
END
$$
DELIMITER ;
라고 부르다
Select ExistTable('my_table');
0이 있으면 1을 반환합니다(존재하지 않으면 0을 반환합니다.
SELECT 이외의 옵션은 SELECT에서 사용되는 데이터베이스 이름을 허용하지 않기 때문에 다음과 같이 적습니다.
SELECT COUNT(*) AS cnt FROM information_schema.TABLES
WHERE CONCAT(table_schema,".",table_name)="db_name.table_name";
이것을 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;
}
여기에서는, 몇개의 회답에 주의할 필요가 있습니다.
1)INFORMATION_SCHEMA.TABLES
에는 TEMPOLY 테이블은 포함되지 않습니다.
의 2) 사용SHOW
"Discription, ")SHOW TABLES LIKE 'test_table'
는 결과 세트를 반환하는 스토어드 프로시저 내에서 테이블이 서버 측에 존재하는지 여부를 확인하기 위해 바람직하지 않은 동작을 클라이언트에 강제로 반환합니다.
3)3) .SELECT 1 FROM test_table LIMIT 1
.
다음과 같은 작업을 수행할 경우:
SET @table_exists = 0;
SET @table_exists = (SELECT 1 FROM test_table LIMIT 1);
테이블에 행이 0일 경우 예상된 결과를 얻을 수 없습니다.
다음은 모든 테이블(일시적이라도)에서 작동하는 저장 프로시저입니다.
다음과 같이 사용할 수 있습니다.
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 ;
지금까지 온도 테이블과 일반 테이블을 모두 확인하는 'Go-to' EXISTS 절차였습니다.이 절차는 MySQL 버전 5.6 이상에서 작동합니다.@DEBUG 파라미터는 옵션입니다.기본 스키마는 상정되지만 @s 문의 테이블에 연결할 수 있습니다.
drop procedure if exists `prcDoesTableExist`;
delimiter #
CREATE PROCEDURE `prcDoesTableExist`(IN pin_Table varchar(100), OUT pout_TableExists BOOL)
BEGIN
DECLARE `boolTableExists` TINYINT(1) DEFAULT 1;
DECLARE CONTINUE HANDLER FOR 1243, SQLSTATE VALUE '42S02' SET `boolTableExists` := 0;
SET @s = concat('SELECT null FROM `', pin_Table, '` LIMIT 0 INTO @resultNm');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
set pout_TableExists = `boolTableExists`; -- Set output variable
IF @DEBUG then
select IF(`boolTableExists`
, CONCAT('TABLE `', pin_Table, '` exists: ', pout_TableExists)
, CONCAT('TABLE `', pin_Table, '` does not exist: ', pout_TableExists)
) as result;
END IF;
END #
delimiter ;
다음으로 @debug on을 사용한 콜문의 예를 나타냅니다.
set @DEBUG = true;
call prcDoesTableExist('tempTable', @tblExists);
select @tblExists as '@tblExists';
변수 @tblExists는 부울을 반환합니다.
테이블을 작성하기 전에 항상 SQL Server 데이터베이스에 테이블이 있는지 여부를 확인하는 것이 좋습니다.
USE [DB_NAME]
GO
IF OBJECT_ID('table_name', 'U') IS NOT NULL
BEGIN
PRINT 'Table exists.'
END
ELSE
BEGIN
PRINT 'Table does not exist.'
END
또는 sys를 사용합니다.SQL Server에 테이블이 있는지 여부를 확인하는 개체입니다.
USE [DB_NAME]
GO
IF EXISTS(SELECT 1 FROM sys.Objects
WHERE Object_id = OBJECT_ID(N'table_name')
AND Type = N'U')
BEGIN
PRINT 'Table exists.'
END
ELSE
BEGIN
PRINT 'Table does not exist.'
END
언급URL : https://stackoverflow.com/questions/8829102/check-if-mysql-table-exists-without-using-select-from-syntax
'source' 카테고리의 다른 글
대량 가져오기/삭제 후 WordPress 분류법(카테고리/태그)의 개수 필드를 업데이트하는 방법 (0) | 2023.02.08 |
---|---|
두 날짜 사이의 날짜인지 PHP 확인 (0) | 2023.01.27 |
Jackson databind 열거형 대소문자를 구분하지 않음 (0) | 2023.01.27 |
React의 useState()는 무엇입니까? (0) | 2023.01.27 |
WAMP에서 MySql을 MariaDb로 대체하는 방법 (0) | 2023.01.27 |