SQL:判断数据表中字段是否存在

最近的项目中,有个需求需要重新创建字段,但是老的版本已经上线,原来的数据我们不能给它破坏,所以就需要判断一下是否已经存在那个字段,如果不存在就新建一个,如果存在就什么也不做。

遇到的问题

解决这个问题的时候,google了不少的办法,但是没有成功。无论是使用if条件判断,还是使用exist函数的时候都会报错。

1
2
3
4
if Not exists(select * from sysobjects where id=object_id('tableName') and name='columnName' ) then
begin
alert table tableName add columnName
end;

这个时候会报出字段不存在的错,在执行select这条命令的时候,由于数据表中还没有columnName这个字段,也就不认识columnName,所以报错。

类似的,中间还出过几个错,在这里就不一一列举了。

最终的解决办法

最后的解决办法是在一个mysql的官方讨论区里找到的。在这里先给出解法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SET @dbname = DATABASE ( );
SET @tablename = "tableName";
SET @columnname = "columnName";
SET @preparedStatement = (
SELECT
IF (
(
SELECT
COUNT( * )
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
( table_name = @tablename )
AND ( table_schema = @dbname )
AND ( column_name = @columnname )
) > 0,
"SELECT 1",
CONCAT( "ALTER TABLE ", @tablename, " ADD ", @columnname, " VARCHAR(31) not null;" )
)
);
PREPARE alterIfNotExists
FROM
@preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

下面我做下简单解释。

1.首先,定义了三个变量,分别为数据库名,表名,字段名,这是后面会重复用到的,所以在这里进行定义。
2.然后定义了另一个变量,这个变量主要执行查找select,查找是否存在我们要添加的字段的相关记录。
3.最后是这个解法的最特别之处:定义一个预处理变量,这个变量就是处理上面我们的查找的那个变量,然后执行预处理。最后Deallocate一下,释放所使用的数据库资源

预处理语句

好了,问题解决了,但是肯定还是有疑惑的:什么是预处理语句呢?

MySQL官方将prepareexecutedeallocate统称为PREPARE STATEMENT。我们称之为【预处理语句】

预处理,顾名思义,预先处理。他会在sql执行之前进行语句解析,然后统一执行一次或多次。通过上面的例子我们可以看到,预处理其实非常简单。

笔者对sql研究较少,理解有限,所以在这里给出预处理的官方参考

总结

通过这次编写sql语句,感受到了sql的博大,从最开始比较水比较基础的sql语句,到后面使用预处理,语句质量提升了一大步,对sql又产生了兴趣。

坚持原创技术分享,您的支持将鼓励我继续创作!