mysql:检查一个查询中是否存在表和列?

时间:2018-02-08 17:05:11

标签: mysql

使用多个表时,任务是检查表是否存在以及是否存在某些列。

查询

SELECT
    (TABLE_NAME) AS table_name,
    (GROUP_CONCAT(COLUMN_NAME)) AS column_name
FROM information_schema.COLUMNS
WHERE
    TABLE_SCHEMA = 'dbms'
AND
    TABLE_NAME IN ('user', 'status')
AND
    COLUMN_NAME IN ('id', 'name')
GROUP BY table_name

可以正常检测现有列,但如果任何一个表不存在或者没有列存在,则不返回任何内容。 后者应该有所区别。 如何? 如何知道它是不存在的表名还是列名?

为了澄清,上面的查询将返回2行2列:

user   | id, name
status | id, name

表示每个表都有两列。

将一个列名更改为,例如,name1,将导致:

user   | id
status | id

表示只存在id。

将列名更改为name1,id1将不返回任何内容。 这就是问题。无法说明表格是否存在或列。

如果回报看起来像是这样的话会很好:

user   | ''
status | ''

如果,状态不存在,那么就像:

user   | ''

可以解码的内容只有用户表存在,而且没有在其中命名的列。

2 个答案:

答案 0 :(得分:1)

您不能将WHERE用于column_name,即使它们不匹配,您仍然希望结果集中包含行。看起来你想要的唯一真正的WHERE子句基于表名,而列名只是一个显示条件。

SELECT
    table_name
    GROUP_CONCAT(IF(column_name IN ('id','name'), column_name, NULL))
FROM information_schema.columns
WHERE table_schema = 'dbms'
AND table_name IN ('user','status')
GROUP BY table_name

答案 1 :(得分:-1)

你只需要改变逻辑和条件,如查询中所述TABLE_SCHEMA ='dbms' 和     TABLE_NAME IN('用户','状态') 和     COLUMN_NAME IN('id','name')

如果在dbms中存在具有列名id或名称的表用户或状态,它将仅获取结果集, 您可以做的是单独检查表格,如果表格存在则检查列。我希望它会有所帮助