我在mysql中有一个包含很多列的表,我希望看到最大值的长度。我的目的是我知道插入时有些数据被截断,我想增加varchar长度。但不知道,列什么。 (解释有点凌乱,但可能sql会有意义)
我试过了:
select COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, DATA_TYPE, (SELECT LENGTH(COLUMN_NAME) as maxlen FROM my_database.my_table ORDER BY maxlen DESC LIMIT 1)
from information_schema.columns
where table_schema = 'my_database' AND
table_name = 'my_table'AND DATA_TYPE = 'varchar'
它可以工作,但返回列的长度,但不返回其中的数据。 (即我的id列被称为id
,我得到了2)。
如果我使用JOIN(ON TRUE
条件),我收到COLUMN_NAME未定义的错误。
存储过程不允许数据返回,并且函数不允许在其中包含动态sql。
如何告诉MySQL(如果我的查询)将COLUMN_NAME视为字符串,而不是列名?如果不是这样,可以选择,如何获取其中包含最大数据的列?
所需结果如下:
column_1 | 25 | varchar | 20
column_2 | 25 | varchar | 7
我只对varchar感兴趣,因为int调整没有意义(并且不需要)。列的长度不同(varchar(20)
,varchar(25)
等。)
更新1:这也不能通过循环完成(语句不能在游标内执行)。
答案 0 :(得分:1)
我使用这种类型的代码来使用表模式自动生成我的视图。使用可以根据您的需要进行修改。
$sql = "show tables from DBName where Tables_in_yourtbalename = 'yourtbalename' ";
$result = executeQuery($sql, $conn);
$num = $result->num_rows;
if ($num) {
$sql = "show columns from yourtbalename where Extra != 'auto_increment'";
$result = executeQuery($sql, $conn);
$num2 = $result->num_rows;
while ($r = $result->fetch_assoc()) {
if ($r['Key'] == 'MUL' && ( preg_match("/^int/", $r['Type']) || preg_match("/^smallint/", $r['Type']) || preg_match("/^tinyint/", $r['Type']) || preg_match("/^bigint/", $r['Type']))) {
} else if ($r['Field'] == 'status') {
}
}
$ r [' Field']是字段名称,$ r [' Type']提供其类型。用于确定maxlength使用
$maxlength="' . substr(str_replace(")", "", $r['Type']), 8, (strlen(str_replace(")", "", $r['Type']))));