MySQL: 我们如何动态地选择合适的类型?
MySQL: How can we dynamically choose an appropriate type?
- 有这样的机会吗?比方说,我们有一个整数范围。我们遍历它们并发现它们不超过 65535。所以,现在我们知道
SMALLINT
将是一个 suitable 类型并且将创建一个带有列的 table合适的类型!我们该怎么做?
- 我尝试过各种组合,例如:
SET @ty := "INT";
CREATE TABLE tab (
id @ty
);
但他们都失败了,并最终在 @ty
上抱怨。
所以,另一个问题是我们是否可以在服务器脚本中保留 @variable
(如 INT
或 "INT"
)?
非常感谢您的宝贵时间!
通过遍历它们,发现它们不超过65535,如果你的意思是最高值不超过65535 , 然后我们可以使用 max() 函数来获取最大值。如果您指的是范围内值的数量,则应改用 count() 函数。接下来我们可以执行条件检查以确定应使用哪种数字类型。剩下的就是使用 PREPARED STATEMENT 根据条件检查的结果创建想要的 table。为了说明,我们创建一个 table 并插入值来模拟数字范围。然后使用程序动态创建预期的 table。
create table numbers (n int);
insert numbers values(1),(2),(70000);
delimiter //
drop procedure if exists create_table //
create procedure create_table()
begin
declare num_range int;
select max(n) from numbers into num_range; -- supposing you mean the highest values does not exceed 65535
If num_range<65536 then
set @create_tb_stmt=concat('create table `tab` (id smallint);');
else
set @create_tb_stmt=concat('create table `tab` (id int);');
end if;
drop table if exists `tab` ;
PREPARE stmt FROM @create_tb_stmt;
EXECUTE stmt;
end//
call create_table // -- call the procedure to make it happen
- 有这样的机会吗?比方说,我们有一个整数范围。我们遍历它们并发现它们不超过 65535。所以,现在我们知道
SMALLINT
将是一个 suitable 类型并且将创建一个带有列的 table合适的类型!我们该怎么做?
- 我尝试过各种组合,例如:
但他们都失败了,并最终在SET @ty := "INT"; CREATE TABLE tab ( id @ty );
@ty
上抱怨。 所以,另一个问题是我们是否可以在服务器脚本中保留@variable
(如INT
或"INT"
)?
非常感谢您的宝贵时间!
通过遍历它们,发现它们不超过65535,如果你的意思是最高值不超过65535 , 然后我们可以使用 max() 函数来获取最大值。如果您指的是范围内值的数量,则应改用 count() 函数。接下来我们可以执行条件检查以确定应使用哪种数字类型。剩下的就是使用 PREPARED STATEMENT 根据条件检查的结果创建想要的 table。为了说明,我们创建一个 table 并插入值来模拟数字范围。然后使用程序动态创建预期的 table。
create table numbers (n int);
insert numbers values(1),(2),(70000);
delimiter //
drop procedure if exists create_table //
create procedure create_table()
begin
declare num_range int;
select max(n) from numbers into num_range; -- supposing you mean the highest values does not exceed 65535
If num_range<65536 then
set @create_tb_stmt=concat('create table `tab` (id smallint);');
else
set @create_tb_stmt=concat('create table `tab` (id int);');
end if;
drop table if exists `tab` ;
PREPARE stmt FROM @create_tb_stmt;
EXECUTE stmt;
end//
call create_table // -- call the procedure to make it happen