检查数据库表中是否存在列

时间:2013-05-13 12:01:01

标签: coldfusion

我使用以下代码检查列是否存在,何时不存在,然后创建它。

<cfquery name="qSelect" datasource="#dbname#">
    select Top 0 * from Elements
</cfquery>

<cfif not ListFindNoCase(qSelect.columnlist,"idLang")>
   <cfquery name="qAlterTable" datasource="#dbname#" dbtype="ODBC">
      ALTER TABLE Elements ADD idLang varchar(200) NULL
   </cfquery>
</cfif>

有人可以建议是否有更好的方法吗?

5 个答案:

答案 0 :(得分:3)

我会直接查询information_schema

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' 
AND COLUMN_NAME = 'idLang'

如果您要检查多个列名称,可以将=更改为IN,然后执行您现在正在执行的相同检查(listFindNoCASE)。我不知道这两种方式都更快/更好,但我就是这样做的。

您没有指定DBMS,但这适用于SQL Server和MySQL

答案 1 :(得分:3)

如果你有ColdFusion 8+,最好的方法是使用&lt; cfdbinfo&gt;。然后,您可以将它与任何数据库一起使用。

<cfdbinfo datasource="votethisway.com" name="myColumns" type="columns" table="tblPoll" pattern="idLang">
<cfdump var="#myColumns#" label="myColumns">

&LT; cfdbinfo&GT;返回一个查询对象,其中包含有关表中每列的所有信息。 pattern属性可用作过滤器,以将结果简化为您正在测试的列。

这是&lt; cffunction&gt;将它包装在一个漂亮的包装中:

<cffunction access="public" name="tableColumnExists" output="no" returntype="boolean" description="returns true if a table column exists" verifyclient="no" securejson="false">
    <cfargument name="datasource" type="string" required="yes" hint="name of the datasource">
    <cfargument name="table" type="string" required="yes" hint="name of the table">
    <cfargument name="column" type="string" required="yes" hint="name of the column">

    <!---initialize private variables--->
    <cfset var local = StructNew()>

    <cftry>
        <cfdbinfo datasource="#arguments.datasource#" name="local.qryColumns" type="columns" table="#arguments.table#" pattern="#arguments.column#">
        <cfcatch type="Database">
            <cfreturn false>
        </cfcatch>
    </cftry>

    <cfif local.qryColumns.RecordCount>
        <cfreturn true>
    </cfif>
    <cfreturn false>
</cffunction>

答案 2 :(得分:1)

马特的答案是最好的。

如果您不想先测试或者您正在使用像JET这样的真棒数据库,您也可以将查询包装在<cftry>标记中

<cftry>
    <cfquery name="qAlterTable" datasource="#dbname#" dbtype="ODBC">
        ALTER TABLE 
            Elements 
        ADD idLang varchar(200) NULL
    </cfquery>
    <cfcatch type = "database">
        <cfoutput>#cfcatch.message# - #cfcatch.details#</cfoutput>
    </cfcatch>
</try>

答案 3 :(得分:0)

所以,我按照这个对话框中的每个建议,每一个都是另一个坚果。然后我又花了3个小时在互联网上,仍然没有为这个问题提出一个简单的解决方案。

知道coldfusion是一种简单的服务器端语言,我知道某处有一些答案,所以我尝试了“columnList”函数。令人惊讶的是,这有效:

<cfquery name="my_Recordset" datasource="my_Datasource">
   SELECT * FROM my_Table
</cfquery>

<CFIF NOT ISDEFINED('my_Recordset.my_Column')>
   <!--- create column because it doesnt exist --->
<cfelse>
   <!--- drop or update column because it exist --->
</cfif>

此外,您可能希望将表中的所有列放在List中,您可以使用List Function,ListContains进行搜索,如下所示:

<cfquery name="my_Recordset" datasource="my_Datasource">
   SELECT * FROM my_Table
</cfquery>

<cfset myList = #my_Recordset.columnList#>

<cfset mySearchResult = #ListContains(myList, "my_Column")#>

<CFIF mySearchResult is 0>
   <!--- create column because it doesnt exist --->
<cfelse>
   <!--- drop or update column because it exist --->
</cfif>

答案 4 :(得分:0)

我知道帖子很旧,但是万一有人找它。

这将返回一个布尔值

QueryKeyExists(qSelect, "idLang")