代码之家  ›  专栏  ›  技术社区  ›  clops

MySQL,用SQL检查表中是否有列

  •  103
  • clops  · 技术社区  · 16 年前

    我正在尝试编写一个查询,它将检查MySQL中的特定表是否有特定列,如果没有,则创建它。否则什么也不做。在任何企业级数据库中,这确实是一个简单的过程,然而MySQL似乎是一个例外。

    我觉得

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
               WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update') 
    BEGIN 
    ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
    UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
    END;
    

    会起作用,但失败得很厉害。有办法吗?

    10 回复  |  直到 12 年前
        1
  •  285
  •   Mfoo    15 年前

    这对我很有效。

    SHOW COLUMNS FROM `table` LIKE 'fieldname';
    

    用PHP它会像。。。

    $result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
    $exists = (mysql_num_rows($result))?TRUE:FALSE;
    
        2
  •  164
  •   forsvarir    15 年前

    @胡里奥

    SELECT * 
    FROM information_schema.COLUMNS 
    WHERE 
        TABLE_SCHEMA = 'db_name' 
    AND TABLE_NAME = 'table_name' 
    AND COLUMN_NAME = 'column_name'
    

    对我有用。

        3
  •  18
  •   Martin Miguel Stevens    5 年前

    为了帮助那些正在寻找@Mchl所描述内容的具体示例的人,可以尝试以下方法

     SELECT * FROM information_schema.COLUMNS 
     WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' 
     AND COLUMN_NAME = 'my_column'`
    

    如果它返回false(零结果),那么您就知道该列不存在。

        4
  •  11
  •   quickshiftin    14 年前

    delimiter //
    -- ------------------------------------------------------------
    -- Use the inforamtion_schema to tell if a field exists.
    -- Optional param dbName, defaults to current database
    -- ------------------------------------------------------------
    CREATE PROCEDURE fieldExists (
    OUT _exists BOOLEAN,      -- return value
    IN tableName CHAR(255),   -- name of table to look for
    IN columnName CHAR(255),  -- name of column to look for
    IN dbName CHAR(255)       -- optional specific db
    ) BEGIN
    -- try to lookup db if none provided
    SET @_dbName := IF(dbName IS NULL, database(), dbName);
    
    IF CHAR_LENGTH(@_dbName) = 0
    THEN -- no specific or current db to check against
      SELECT FALSE INTO _exists;
    ELSE -- we have a db to work with
      SELECT IF(count(*) > 0, TRUE, FALSE) INTO _exists
      FROM information_schema.COLUMNS c
      WHERE 
      c.TABLE_SCHEMA    = @_dbName
      AND c.TABLE_NAME  = tableName
      AND c.COLUMN_NAME = columnName;
    END IF;
    END //
    delimiter ;
    

    使用 fieldExists

    mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_option', NULL) //
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select @_exists //
    +----------+
    | @_exists |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_options', 'etrophies') //
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select @_exists //
    +----------+
    | @_exists |
    +----------+
    |        1 |
    +----------+
    
        5
  •  10
  •   wvasconcelos    14 年前

    下面是另一种使用普通PHP而不使用信息模式数据库的方法:

    $chkcol = mysql_query("SELECT * FROM `my_table_name` LIMIT 1");
    $mycol = mysql_fetch_array($chkcol);
    if(!isset($mycol['my_new_column']))
      mysql_query("ALTER TABLE `my_table_name` ADD `my_new_column` BOOL NOT NULL DEFAULT '0'");
    
        6
  •  8
  •   Mchl    16 年前

    只从信息模式中选择列名称,并将此查询的结果放入变量中。然后测试变量以确定表是否需要更改。

    另外,不要忘记为列表指定表\模式。

        7
  •  2
  •   vio    13 年前

    mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)");
    

    如果您已经连接到数据库,它就可以工作。

        8
  •  2
  •   user3706926    10 年前

    public function GetTableColumn() {      
    $query  = $this->db->prepare("SHOW COLUMNS FROM `what_table` LIKE 'what_column'");  
    try{            
        $query->execute();                                          
        if($query->fetchColumn()) { return 1; }else{ return 0; }
        }catch(PDOException $e){die($e->getMessage());}     
    }
    
        9
  •  1
  •   webblover    12 年前

    非常感谢Mfoo,他提供了一个非常好的脚本,可以在表中不存在列的情况下动态添加列。 . 这个 脚本还可以帮助您找到实际需要多少表“Add column” mysql公司。尝尝菜谱。很有魅力。

    <?php
    ini_set('max_execution_time', 0);
    
    $host = 'localhost';
    $username = 'root';
    $password = '';
    $database = 'books';
    
    $con = mysqli_connect($host, $username, $password);
    if(!$con) { echo "Cannot connect to the database ";die();}
    mysqli_select_db($con, $database);
    $result=mysqli_query($con, 'show tables');
    $tableArray = array();
    while($tables = mysqli_fetch_row($result)) 
    {
         $tableArray[] = $tables[0];    
    }
    
    $already = 0;
    $new = 0;
    for($rs = 0; $rs < count($tableArray); $rs++)
    {
        $exists = FALSE;
    
        $result = mysqli_query($con, "SHOW COLUMNS FROM ".$tableArray[$rs]." LIKE 'tags'");
        $exists = (mysqli_num_rows($result))?TRUE:FALSE;
    
        if($exists == FALSE)
        {
            mysqli_query($con, "ALTER TABLE ".$tableArray[$rs]." ADD COLUMN tags VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL");
            ++$new;
            echo '#'.$new.' Table DONE!<br/>';
        }
        else
        {
            ++$already;
            echo '#'.$already.' Field defined alrady!<br/>';    
        }
        echo '<br/>';
    }
    ?>
    
        10
  •  0
  •   gmize    13 年前

    只需在表上运行SELECT*查询并检查列是否存在。。。