source

PHP로 MySQL 테이블이 있는지 확인하려면 어떻게 해야 합니까?

bestscript 2023. 8. 28. 21:49

PHP로 MySQL 테이블이 있는지 확인하려면 어떻게 해야 합니까?

이론적으로 간단해 보이지만, 저는 상당한 양의 연구를 했고 이것을 이해하는 데 어려움을 겪고 있습니다.

MySQL 테이블이 존재하는지 그리고 그것이 무엇을 하는지 어떻게 확인할 수 있습니까. (나는 이것에 대해 간단한 php if/else 문이 작동할 수 있다고 생각합니다.)

이것을 할 수 있는 방법이 있습니까?

제가 cwallenpool의 응답으로 한 것은 다음과 같습니다.

mysql_connect("SERVER","USERNAME","PASSWORD");
mysql_select_db('DATABASE');

$val = mysql_query('select 1 from `TABLE`');

if($val !== FALSE)
{
   print("Exists");
}else{
   print("Doesn't exist");
}
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `table_name` LIMIT 1');

if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
}

인정하건대, PHP 관용구보다 더 파이썬적이지만, 다른 한편으로, 당신은 방대한 양의 추가 데이터를 다루는 것에 대해 걱정할 필요가 없습니다.

편집

그래서 이 답변은 제가 이 메시지를 작성할 때 최소 두 번 이상 내려졌습니다.큰 오류를 범했다고 가정하고 몇 가지 벤치마크를 실행해보니 테이블이 없을 때 가장 가까운 대안보다 10% 이상 빠르며 테이블이 존재할 때 25% 이상 빠릅니다.

:::::::::::::::::::::::::BEGINNING NON-EXISTING TABLE::::::::::::::::::::::::::::::
23.35501408577 for bad select
25.408507823944 for select from schema num rows -- calls mysql_num_rows on select... from information_schema.
25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select... from information_schema result
50.669058799744 for SHOW TABLES FROM test
:::::::::::::::::::::::::BEGINNING EXISTING TABLE::::::::::::::::::::::::::::::
15.293519973755 for good select
20.784908056259 for select from schema num rows
21.038464069366 for select from schema fetch row
50.400309085846 for SHOW TABLES FROM test

DESC에 대해 이것을 실행하려고 했지만 276초 후에 시간 초과가 발생했습니다(응답 시간은 24초, 276이 존재하지 않는 테이블에 대한 설명을 완료하지 못했습니다).

적절한 측정을 위해 테이블이 4개뿐인 스키마에 대해 벤치마킹하고 있으며 이는 거의 새로 설치된 MySQL(지금까지 유일한 데이터베이스)입니다.내보내기를 보려면 여기를 보십시오.

더 나아가서는

또한 이 솔루션은 PgSQL 및 Oracle에서 동일한 쿼리가 작동하므로 데이터베이스에 더 독립적입니다.

마침내.

mysql_query()이 테이블이 존재하지 않는 오류에 대해 FALSE를 반환합니다.

테이블이 존재하지 않음을 보장해야 하는 경우mysql_errno()오류 코드를 가져와 관련 MySQL 오류와 비교합니다.

PHP에서 이를 달성하는 가장 깨끗한 방법은 DESCRIBE 문을 사용하는 것입니다.

if ( mysql_query( "DESCRIBE `my_table`" ) ) {
    // my_table exists
}

왜 다른 사람들이 이렇게 직접적인 문제에 대해 복잡한 질문을 올리는지 잘 모르겠습니다.

갱신하다

PDO 사용

// assuming you have already setup $pdo
$sh = $pdo->prepare( "DESCRIBE `my_table`");
if ( $sh->execute() ) {
    // my_table exists
} else {
    // my_table does not exist    
}
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

반환된 레코드가 없으면 레코드가 존재하지 않습니다.

표 이름'과 같은 표 표시

결과가 있으면 테이블이 존재합니다.

PDO에서 이 접근 방식을 사용하는 방법:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;

DEPRECATED mysql_query에서 이 접근 방식을 사용하려면 다음과 같이 하십시오.

$result      = mysql_query("SHOW TABLES LIKE 'tableName'");
$tableExists = mysql_num_rows($result) > 0;

125마이크로초 테이블 존재 확인

.000125초(125µs)

mysql_unbuffered_query("SET profiling = 1");  // for profiling only

@mysql_unbuffered_query("SELECT 1 FROM `table` LIMIT 1 ");
if (mysql_errno() == 1146){

 // NO EXISTING TABLE CODE GOES HERE

}
elseif(mysql_errno() > 0){

  echo mysql_error();    

}

$results = mysql_query("SHOW PROFILE");  // for profiling only

mysql 프로파일링을 사용하여 측정한 실행 시간(테이블이 존재하는지 여부)은 약 .000125초입니다. (125초)

LIMIT 1은 속도에 중요합니다.이렇게 하면 결과 정렬 및 데이터 전송 쿼리 상태 시간이 최소화됩니다.그리고 테이블 크기는 요인이 아닙니다.

결과가 필요하지 않을 때는 항상 버퍼링되지 않은 쿼리를 사용합니다.

테이블이 없는 경우의 프로파일 결과

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000025  
checking permissions  0.000006  
Opening tables        0.000065  
query end             0.000005  
closing tables        0.000003  
freeing items         0.000013  
logging slow query    0.000003  
cleaning up           0.000003  
TOTAL                 0.000123  <<<<<<<<<<<< 123 microseconds

테이블이 있는 경우

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000024
checking permissions  0.000005
Opening tables        0.000013
System lock           0.000007
init                  0.000006
optimizing            0.000003
statistics            0.000009
preparing             0.000008
executing             0.000003
Sending data          0.000019
end                   0.000004
query end             0.000004
closing tables        0.000006
freeing items         0.00001
logging slow query    0.000003
cleaning up           0.000003
TOTAL                 0.000127 <<<<<<<<<<<< 127 microseconds
mysql_query("SHOW TABLES FROM yourDB");
//> loop thru results and see if it exists
//> in this way with only one query one can check easly more table 

또는mysql_query("SHOW TABLES LIKE 'tblname'");

사용하지 mysql_list_tables();더 이상 사용되지 않기 때문입니다.

잘못된 쿼리보다 더 빠릅니다.

SELECT count((1)) as `ct`  FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';

이렇게 하면 하나의 필드와 하나의 값을 내 느린 시스템에 대해 0.016초만 검색할 수 있습니다.

이미 게시되었지만 여기 PDO(동일한 쿼리)와 함께 있습니다...

$connection = new PDO ( "mysql:host=host_db; dbname=name_db", user_db, pass_db );

if ($connection->query ("DESCRIBE table_name"  )) {
    echo "exist";
} else {
    echo "doesn't exist";
}

나에게 매력적으로 작용합니다.

그리고 여기 또 다른 접근법이 있습니다(저는 그것이 더 느리다고 생각합니다).

if ($connection->query ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' AND table_name ='tbl_name'" )->fetch ()) {
    echo "exist";
} else {
    echo "doesn't exist";
}

이 쿼리를 사용하여 재생할 수도 있습니다.

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

이것은 mysql 페이지에서 사용하기 위해 제안된 것 같습니다.

더 이상 MYSQL을 사용하지 마십시오.mysqli를 사용해야 하지만 PDO가 최선인 경우:

$pdo = new PDO($dsn, $username, $pdo); // proper PDO init string here
if ($pdo->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name'")->fetch()) // table exists.
<?php 
$connection = mysqli_connect("localhost","root","","php_sample_login_register"); 

if ($connection){
        echo "DB is Connected <br>";
        $sql = "CREATE TABLE user(
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
            name VARCHAR(255)NOT NULL,
            email VARCHAR(255)NOT NULL,
            password VARCHAR(255) NOT NULL
            );";
        if(mysqli_query($connection,$sql)) {
            echo "Created user table";
        } else{
            echo "User table already exists";
        }
    } else {
        echo "error : DB isnot connected";
    } ?>

아니면 당신은 사용할 수 있습니다.

tables_in_{insert_db_name}='tablename'인 테이블을 표시합니다.

다양한 쿼리를 사용하여 테이블이 있는지 확인할 수 있습니다.다음은 여러 항목을 비교한 것입니다.

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');

mysql_query("DESCRIBE `table_name`");  
70000   rows: 24ms  
1000000 rows: 24ms  
5000000 rows: 24ms

mysql_query('select 1 from `table_name`');  
70000   rows: 19ms  
1000000 rows: 23ms  
5000000 rows: 29ms

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');  
70000   rows: 18ms  
1000000 rows: 18ms  
5000000 rows: 18ms  

다음 벤치마크는 평균에 불과합니다.

언급URL : https://stackoverflow.com/questions/6432178/how-can-i-check-if-a-mysql-table-exists-with-php