[SQL] 테이블이 사용하지 않고있는 경우 "선택"체크
SQL테이블이 사용하지 않고있는 경우 "선택"체크
테이블이 선택하고 그것으로부터 값을 확인하지 않고 존재 여부를 확인하는 방법이 있나요?
그건 내가 testtable에서 선택 testcol 가서 반환 필드의 수를 확인하실 수 있습니다 알고 있지만 그것을 할 수있는보다 직접적인 / 우아한 방법이있을 것 같다.
해결법
-
==============================
1.당신은 아무것도 계산 할 필요가 없습니다.
당신은 아무것도 계산 할 필요가 없습니다.
SELECT 1 FROM testtable LIMIT 1;
오류가없는 경우, 테이블이 존재합니다.
또는 당신이 정확하려면, 사용 INFORMATION_SCHEMA.
SELECT * FROM information_schema.tables WHERE table_schema = 'yourdb' AND table_name = 'testtable' LIMIT 1;
양자 택일로, 당신은 쇼 테이블을 사용할 수 있습니다
SHOW TABLES LIKE 'yourtable';
결과 집합의 행이있는 경우, 테이블이 존재합니다.
-
==============================
2.
SELECT count(*) FROM information_schema.TABLES WHERE (TABLE_SCHEMA = 'your_db_name') AND (TABLE_NAME = 'name_of_table')
0이 아닌 수를 얻을 경우, 테이블이 존재한다.
-
==============================
3.성능 비교 :
성능 비교 :
322ms : 'table201608'와 같은 쇼 테이블;
691ms : table201608 제한 1에서 1을 선택;
319ms : SELECT COUNT (*) INFORMATION_SCHEMA.TABLES FROM WHERE (TABLE_SCHEMA = 'MYDB') AND (TABLE_NAME = 'table201608');
참고이 많이 실행하는 경우 - 짧은 기간에 많은 HTML 요청을 통해 같은 -이 평균 200 밀리 캐시 또는 빨리 할 것이기 때문에 2는 빠른 방법이 될 것입니다.
-
==============================
4.당신은 INFORMATION_SCHEMA 테이블 시스템 뷰를 조회 할 수 있습니다 :
당신은 INFORMATION_SCHEMA 테이블 시스템 뷰를 조회 할 수 있습니다 :
SELECT table_name FROM information_schema.tables WHERE table_schema = 'databasename' AND table_name = 'testtable';
행이 반환되지 않으면, 테이블이 존재하지 않습니다.
-
==============================
5.오히려 오류에 의존하는 대신 테이블이 존재하는지 INFORMATION_SCHEMA.TABLES을 조회 할 수 있습니다. 기록이 있다면, 그것은 존재한다. 대한 기록이 없다면, 그것은 존재하지 않습니다.
오히려 오류에 의존하는 대신 테이블이 존재하는지 INFORMATION_SCHEMA.TABLES을 조회 할 수 있습니다. 기록이 있다면, 그것은 존재한다. 대한 기록이 없다면, 그것은 존재하지 않습니다.
-
==============================
6.여기에서 select *가 아닌 테이블입니다
여기에서 select *가 아닌 테이블입니다
SHOW TABLES FROM `db` LIKE 'tablename'; //zero rows = not exist
데이터베이스 프로에서이있어, 여기에 내가 들었다 것입니다 :
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
-
==============================
7.위의 모든 읽은 후, 나는 다음과 같은 성명을 선호한다 :
위의 모든 읽은 후, 나는 다음과 같은 성명을 선호한다 :
SELECT EXISTS( SELECT * FROM information_schema.tables WHERE table_schema = 'db' AND table_name = 'table' );
그것은 당신이 원하는 것을 정확히 표시하고 실제로는 '부울'를 반환합니다.
-
==============================
8.위에서이 수정 된 솔루션은 현재 데이터베이스의 명시적인 지식을 필요로하지 않습니다. 그런 다음 더 유연합니다.
위에서이 수정 된 솔루션은 현재 데이터베이스의 명시적인 지식을 필요로하지 않습니다. 그런 다음 더 유연합니다.
SELECT count(*) FROM information_schema.TABLES WHERE TABLE_NAME = 'yourtable' AND TABLE_SCHEMA in (SELECT DATABASE());
-
==============================
9.그냥 그것을 할 수있는 별도의 방법을 추가하고 er_no_such_table 오류에 대한 핸들러 사용할 수에 대한 당신이 그것을 필요에 따라하려면 다음과 같이 1146 :
그냥 그것을 할 수있는 별도의 방법을 추가하고 er_no_such_table 오류에 대한 핸들러 사용할 수에 대한 당신이 그것을 필요에 따라하려면 다음과 같이 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 ;
-
==============================
10.'TABLE_NAME'와 같은 테이블을 보여
'TABLE_NAME'와 같은 테이블을 보여
이 행을 반환하는 경우> 0 표가 존재
-
==============================
11.아래 같은 작업을 수행 할 수 있습니다
아래 같은 작업을 수행 할 수 있습니다
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!"); }
-
==============================
12.이 답변을 확장하면, 하나는 더 리턴 TRUE / FALSE로 테이블의 존재 여부를 기반으로하는 함수를 작성할 수 있습니다 :
이 답변을 확장하면, 하나는 더 리턴 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');
-
==============================
13.나는 PHP에서 이것을 사용합니다.
나는 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; }
-
==============================
14.여기에 답변을주의해야 할 몇 가지 문제가 있습니다 :
여기에 답변을주의해야 할 몇 가지 문제가 있습니다 :
1) INFORMATION_SCHEMA.TABLES가하는 임시 테이블을 포함하지.
2) SHOW 쿼리의 모든 유형을 사용하여, 즉 쇼 테이블 LIKE 'test_table', 테이블이 저장 프로 시저 내에서, 서버 측 존재하는지 확인하기 위해 바람직하지 않은 행동을하는 클라이언트에 결과 집합의 반환을 강제로 그 또한 반환 결과 집합.
3) 일부 사용자가 언급 한 바와 같이, 당신은 당신이 test_table LIMIT 1 일부터 1 SELECT 사용하는 방법에주의해야한다.
당신이 뭔가를 할 경우 :
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 ;
-
==============================
15.이되었습니다 내 '이동 -에'는 검사 임시 및 일반 두 테이블 절차를 존재한다. 이 절차는 MySQL 버전 5.6 이상에서 작동합니다. @DEBUG 매개 변수는 선택 사항입니다. 기본 스키마는 가정하지만, @s 문에서 테이블에 연결될 수 있습니다.
이되었습니다 내 '이동 -에'는 검사 임시 및 일반 두 테이블 절차를 존재한다. 이 절차는 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와 예제 호출 문은 다음과 같습니다
set @DEBUG = true; call prcDoesTableExist('tempTable', @tblExists); select @tblExists as '@tblExists';
변수 @tblExists은 부울을 반환합니다.
-
==============================
16.이 컴팩트 한 방법 반환 한 존재 0 경우 존재하지 않는 경우.
이 컴팩트 한 방법 반환 한 존재 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을 반환합니다.
-
==============================
17.SELECT에서 사용되는 내가 쓴 있도록 SELECT 제외 옵션 없음, 데이터베이스 이름을 허용하지 않습니다
SELECT에서 사용되는 내가 쓴 있도록 SELECT 제외 옵션 없음, 데이터베이스 이름을 허용하지 않습니다
SELECT COUNT(*) AS cnt FROM information_schema.TABLES WHERE CONCAT(table_schema,".",table_name)="db_name.table_name";
from https://stackoverflow.com/questions/8829102/check-if-table-exists-without-using-select-from by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리 : 최신 N 제외하고는 테이블에서 모든 기록을 삭제 하시겠습니까? (0) | 2020.03.28 |
---|---|
[SQL] SQL은 대 SQL 하위 쿼리 (성능)에 합류? (0) | 2020.03.28 |
[SQL] 동적 SELECT TOP @var에서 SQL 서버 (0) | 2020.03.28 |
[SQL] 그것은 열하지 삽입을 반환하는 SQL 출력 절의 할 수 있습니까? (0) | 2020.03.28 |
[SQL] SQL 서버 - 오류에 거래 롤 다시? (0) | 2020.03.28 |