MySQL SELECT 列名未知
MySQL SELECT with unknown columnname
我需要这样的查询:SELECT id FROM database.table;
但是我没有主键的列名,因为查询必须对更多 tables 具有通用性。所以我试着这样查询:
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;
但是我得到的列表不是带有 table 的主键值的列表,例如 1,2,3,4...
如何获取主键的值?
不,您不能简单地将子查询中的列名作为数据并将它们用作外部查询中 select 列表的一部分。 SQL 这样不行。您需要 assemble 在 MySQL 之外的程序中或使用 prepared statement.
您的查询
因此,您在单独的查询中查询列名并将它们放入变量字符串中,然后通过连接 sql 语句的各个部分将 select 语句创建为字符串, 然后创建、执行和销毁准备好的语句。
使用prepare语句获取
生成查询
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;
验证一下(仅供测试)
SELECT @query;
执行准备语句
PREPARE stmt FROM @query;
EXECUTE stmt;
放弃它
DEALLOCATE PREPARE stmt;
我需要这样的查询:SELECT id FROM database.table;
但是我没有主键的列名,因为查询必须对更多 tables 具有通用性。所以我试着这样查询:
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;
但是我得到的列表不是带有 table 的主键值的列表,例如 1,2,3,4... 如何获取主键的值?
不,您不能简单地将子查询中的列名作为数据并将它们用作外部查询中 select 列表的一部分。 SQL 这样不行。您需要 assemble 在 MySQL 之外的程序中或使用 prepared statement.
您的查询因此,您在单独的查询中查询列名并将它们放入变量字符串中,然后通过连接 sql 语句的各个部分将 select 语句创建为字符串, 然后创建、执行和销毁准备好的语句。
使用prepare语句获取
生成查询
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;
验证一下(仅供测试)
SELECT @query;
执行准备语句
PREPARE stmt FROM @query;
EXECUTE stmt;
放弃它
DEALLOCATE PREPARE stmt;