MySQL ตรวจสอบว่ามีตารางอยู่หรือไม่โดยไม่มีข้อยกเว้น


123

วิธีใดคือวิธีที่ดีที่สุดในการตรวจสอบว่ามีตารางอยู่ใน MySQL หรือไม่ (ควรใช้ PDO ใน PHP) โดยไม่ต้องมีข้อยกเว้น ฉันไม่รู้สึกเหมือนกำลังแยกวิเคราะห์ผลลัพธ์ของ "SHOW TABLES LIKE" และอื่น ๆ ต้องมีแบบสอบถามบูลีนบ้างไหม?

คำตอบ:


199

ฉันไม่ทราบไวยากรณ์ PDO แต่ดูเหมือนจะตรงไปตรงมา:

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

ขอบคุณลืมไปเลยว่า SHOW TABLES LIKE สามารถ จำกัด ไว้ที่ตารางเดียวเท่านั้น
คลิป

53
PDO: $ tableExists = $ db-> query ("แสดงตารางเช่น 'myTable'") -> rowCount ()> 0;
Reactgular

4
mysqli: if ($ db-> query ("SHOW TABLES LIKE 'myTable'") -> num_rows == 0) {// create table}
zPuls3

1
@MathewFoscarini, rowCount () อาจจะไม่เป็นที่เชื่อถือได้ในกรณีนี้เห็นPHP doc
datasn.io

4
นอกจากนี้ยังไม่มีการสนับสนุนเพิ่มเติมสำหรับmysql_*ฟังก์ชั่นที่พวกเขาจะยกเลิกอย่างเป็นทางการ , ไม่มีการบำรุงรักษาและจะถูกลบออกในอนาคต คุณควรอัปเดตโค้ดของคุณด้วยPDOหรือMySQLiเพื่อให้แน่ใจว่าการทำงานของโครงการของคุณในอนาคต
TRiG

39

หากคุณใช้ MySQL 5.0 ขึ้นไปคุณสามารถลอง:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

ผลลัพธ์ใด ๆ ที่ระบุว่ามีตารางอยู่

จาก: http://www.electrictoolbox.com/check-if-mysql-table-exists/


บางทีฉันอาจจะขาดอะไรไป แต่ทำไมคุณถึงใช้วิธีนี้กับ SHOW TABLES?
nickf

1
@nickf เป็นส่วนหนึ่งของมาตรฐาน ansi ดังนั้นจึงพกพาได้ระหว่าง rdbms'es ที่แตกต่างกัน
troelskn

@nickf: นอกจากนี้ยังทำงานบนฐานข้อมูลอื่นที่ไม่ใช่ MySQL ซึ่งรวมถึง PostgreSQL และ SQL Server เท่าที่ฉันสามารถบอกได้
Powerlord

สงสัยว่านี่เป็นการใช้ประโยชน์จากความปลอดภัยหรือไม่คุณสามารถค้นหาข้อมูลจากฐานข้อมูลที่คุณไม่ได้เชื่อมต่อ ...
Talvi Watia

3
ไม่มีความเสี่ยงด้านความปลอดภัย - การสืบค้นไปยังฐานข้อมูล information_schema จะแสดงเฉพาะตารางที่ผู้ใช้ที่เชื่อมต่อมีสิทธิ์เท่านั้น
Warren Rumak

8

ใช้ mysqli ฉันได้สร้างฟังก์ชันต่อไปนี้ เนื่องจากคุณมีอินสแตนซ์ mysqli ที่เรียกว่า $ con

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

หวังว่าจะช่วยได้

คำเตือน:ตามที่ @jcaron ฟังก์ชั่นนี้อาจเสี่ยงต่อการแนบ sqlinjection ดังนั้นตรวจสอบให้แน่ใจว่า$tablevar ของคุณสะอาดหรือใช้การสืบค้นที่กำหนดพารามิเตอร์ได้ดียิ่งขึ้น


เฉพาะในกรณีที่คุณให้ใครกรอก $ table var ไม่ใช่ว่า var ทุกตัวใน sql statment นั้นอันตรายเฉพาะในกรณีที่คุณได้รับข้อมูลจากแหล่งที่ไม่น่าเชื่อถือ แน่นอนว่าคุณต้องรับผิดชอบในการใช้ฟังก์ชันและการกรอง ไม่จำเป็นต้องลงคะแนนคำตอบนี้
Falk

หากคุณเผยแพร่โค้ดเช่นนี้จะมีคนนำไปใช้ในสถานที่ที่ข้อมูลไม่ได้รับการตรวจสอบอย่างเหมาะสมและจะลงเอยด้วยการแทรก SQL เพียงใช้การร้องขอที่กำหนดพารามิเตอร์และคุณจะหลีกเลี่ยงปัญหาใด ๆ ไม่ว่าข้อมูลจะได้รับการตรวจสอบหรือไม่ก็ตาม ไม่มีเหตุผลใดที่จะไม่ทำที่นี่มันเป็นเพียงการปฏิบัติที่ไม่ดี
jcaron

วิธีการเพิ่ม real_escape_string
Falk

ใช้คำค้นหาที่กำหนดพารามิเตอร์และหลีกเลี่ยงเรื่องราวสยองขวัญ
jcaron

4

โพสต์นี้ง่ายๆถ้าใครมาหาคำถามนี้ แม้ว่าจะได้รับคำตอบเล็กน้อย คำตอบบางส่วนทำให้ซับซ้อนกว่าที่ควรจะเป็น

สำหรับ mysql * ฉันใช้:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

ใน PDO ฉันใช้:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

ด้วยสิ่งนี้ฉันแค่ดันเงื่อนไขอื่นเข้าไปหรือ และสำหรับความต้องการของฉันฉันเพียงแค่ต้องการตาย แม้ว่าคุณสามารถตั้งค่าหรือสิ่งอื่น ๆ บางคนอาจชอบ if / else if / else ซึ่งจะนำออกหรือแล้วจัดหา if / else if / else


3

นี่คือวิธีแก้ปัญหาของฉันที่ฉันชอบเมื่อใช้กระบวนงานที่เก็บไว้ ฟังก์ชัน mysql ที่กำหนดเองสำหรับตรวจสอบตารางที่มีอยู่ในฐานข้อมูลปัจจุบัน

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

เนื่องจาก "แสดงตาราง" อาจทำงานช้าในฐานข้อมูลขนาดใหญ่ขอแนะนำให้ใช้ "DESCRIBE" และตรวจสอบว่าผลลัพธ์เป็นจริง / เท็จหรือไม่

$tableExists = mysqli_query("DESCRIBE `myTable`");

จากสิ่งที่ฉันอ่านถ้า 'SHOW' ไม่มีประสิทธิภาพดังนั้น 'information_schema' จะเป็นที่ต้องการมากกว่า 'DESCRIBE'
Esoterica

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
โปรดเพิ่มความคิดเห็นที่ถูกต้องสำหรับรหัสเพื่อให้คำตอบมีคุณภาพดีที่สุด เพียงแค่วางโค้ดบางส่วนก็ไม่ได้บอกอะไรกับผู้เขียนคำถามมากนัก
Jakub Matczak

5
นี่มันน่ากลัวจริง ดังนั้นหากมี 50,000 ตารางคุณจะต้องโหลดตารางทั้งหมดวนซ้ำแต่ละตารางเพื่อดูว่ามีตารางที่ถูกต้องหรือไม่?
Rohit Chopra

-1

กรอบ Zend

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }

-1

หากเหตุผลที่ต้องการทำคือการสร้างตารางแบบมีเงื่อนไข 'สร้างตารางหากไม่มีอยู่' ดูเหมือนจะเหมาะสำหรับงานนั้น จนกระทั่งฉันค้นพบสิ่งนี้ฉันจึงใช้เมธอด 'DESCRIBE' ด้านบน ข้อมูลเพิ่มเติมที่นี่: MySQL "สร้างตารางถ้าไม่มีอยู่" -> ข้อผิดพลาด 1050


-9

ทำไมคุณถึงทำให้มันยากที่จะเข้าใจ?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.