未知列名称的MySQL SELECT

未知列名称的MySQL SELECT,mysql,select,subquery,Mysql,Select,Subquery,我需要这样的查询:从database.table中选择id 但是我没有主键的列名,因为查询必须是通用的,可以用于更多的表。所以我试着做一个这样的查询: SELECT (SELECT k.COLUMN_NAME AS pk_old FROM information_schema.table_constraints t LEFT JOIN information_schema.key_column_usage k USING(constraint_name,table_schema,table_na

我需要这样的查询:
从database.table中选择id
但是我没有主键的列名,因为查询必须是通用的,可以用于更多的表。所以我试着做一个这样的查询:

SELECT (SELECT k.COLUMN_NAME AS pk_old
FROM information_schema.table_constraints t
LEFT JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
    AND t.table_schema='database'
    AND t.table_name='table')as pk FROM database.table;
但不是一个包含该表主键值的列表,比如1,2,3,4。。。我得到一个id,id,id,id的列表。。。。
如何获取主键的值?

否,您不能简单地将子查询中的列名作为数据,并将其用作外部查询中选择列表的一部分。SQL不是这样工作的。您需要在MySQL之外的程序中或使用


因此,您可以在一个单独的查询中查询列名,将它们放入一个变量字符串中,然后通过连接sql语句的各个部分将select语句创建为字符串,然后创建、执行和销毁准备好的语句。

使用准备语句获取它

生成查询

SELECT
  CONCAT( 'SELECT ',
  GROUP_CONCAT(CONCAT(COLUMN_NAME,' AS FIELD_',ORDINAL_POSITION)) ,
  ' FROM ', TABLE_SCHEMA,'.',TABLE_NAME,' ORDER BY ',
  GROUP_CONCAT(COLUMN_NAME)) INTO @query
FROM information_schema.KEY_COLUMN_USAGE

WHERE
  TABLE_SCHEMA = 'YourSchema'
AND
  TABLE_NAME = 'YorTable'
AND 
  CONSTRAINT_NAME='PRIMARY'
ORDER BY ORDINAL_POSITION;
验证它(仅用于测试)

执行PREPARE语句

PREPARE stmt FROM @query;
EXECUTE stmt;
放下它

SELECT @query;
DEALLOCATE PREPARE stmt;