解决视图中列 name/type 的建议方法
Suggested way to resolve column name/type in a view
我遇到了以下问题,我正在努力寻找最佳解决方案。假设我有如下视图:
CREATE VIEW myView AS (
SELECT
country_code,
other_column,
COUNT(1) as cnt
FROM mytable
JOIN otherDatabase.otherTable ON (id)
GROUP BY 1,2 ORDER BY 1 LIMIT 1
)
解析字段名称和视图类型的最快方法是什么?例如,在上面我希望得到一些类似的东西:
{
country_code: VARCHAR,
other_column: BOOL,
cnt: INT
}
- 第一种方法只是 运行 查询(有限制,如有必要),然后从驱动程序中获取结果集的类型。这样做的缺点是,如果查询需要 50 分钟才能解决怎么办?
- 我想到的第二种方法是 'follow' 列以获取它们的类型,然后进行一些解析以解析任何 expressions/literals/etc。这将涉及大量代码,但会比上述方法快几个数量级。但是,这样做的潜在缺点是我们可能可以访问视图但无法访问包含列类型的 table(可能在服务器上的另一个数据库中),因此我们可能无法解析所有字段名称。
解析视图类型的最佳方法是什么?请注意,我已将其标记为 MySQL,但我也想知道是否有更通用的方法来解析类型,或者它是否是非标准的并且需要在每个数据库的基础上完成更多工作?
Update:我相信正确的答案只是 运行 a DESCRIBE myView
,这会给我不带 [= 的列名和类型35=]正在查询?
至少在 MySQL 的当前版本中,INFORMATION_SCHEMA.COLUMNS
包含视图和基表的元数据:
mysql> create table mytable (id serial primary key, x int);
Query OK, 0 rows affected (0.01 sec)
mysql> create view v as select * from mytable;
mysql> select column_name, data_type from information_schema.columns where table_name='v';
+-------------+-----------+
| COLUMN_NAME | DATA_TYPE |
+-------------+-----------+
| id | bigint |
| x | int |
+-------------+-----------+
相关问题...
SHOW CREATE TABLE myView;
或
SHOW CREATE VIEW myView;
将完全限定所有列。
(编写 JOIN 时,始终限定列名是明智的。)
我遇到了以下问题,我正在努力寻找最佳解决方案。假设我有如下视图:
CREATE VIEW myView AS (
SELECT
country_code,
other_column,
COUNT(1) as cnt
FROM mytable
JOIN otherDatabase.otherTable ON (id)
GROUP BY 1,2 ORDER BY 1 LIMIT 1
)
解析字段名称和视图类型的最快方法是什么?例如,在上面我希望得到一些类似的东西:
{
country_code: VARCHAR,
other_column: BOOL,
cnt: INT
}
- 第一种方法只是 运行 查询(有限制,如有必要),然后从驱动程序中获取结果集的类型。这样做的缺点是,如果查询需要 50 分钟才能解决怎么办?
- 我想到的第二种方法是 'follow' 列以获取它们的类型,然后进行一些解析以解析任何 expressions/literals/etc。这将涉及大量代码,但会比上述方法快几个数量级。但是,这样做的潜在缺点是我们可能可以访问视图但无法访问包含列类型的 table(可能在服务器上的另一个数据库中),因此我们可能无法解析所有字段名称。
解析视图类型的最佳方法是什么?请注意,我已将其标记为 MySQL,但我也想知道是否有更通用的方法来解析类型,或者它是否是非标准的并且需要在每个数据库的基础上完成更多工作?
Update:我相信正确的答案只是 运行 a DESCRIBE myView
,这会给我不带 [= 的列名和类型35=]正在查询?
至少在 MySQL 的当前版本中,INFORMATION_SCHEMA.COLUMNS
包含视图和基表的元数据:
mysql> create table mytable (id serial primary key, x int);
Query OK, 0 rows affected (0.01 sec)
mysql> create view v as select * from mytable;
mysql> select column_name, data_type from information_schema.columns where table_name='v';
+-------------+-----------+
| COLUMN_NAME | DATA_TYPE |
+-------------+-----------+
| id | bigint |
| x | int |
+-------------+-----------+
相关问题...
SHOW CREATE TABLE myView;
或
SHOW CREATE VIEW myView;
将完全限定所有列。
(编写 JOIN 时,始终限定列名是明智的。)