无论如何,将表中的所有列修改为“not null”

时间:2013-09-12 12:47:32

标签: mysql

是否有一个简单的命令来修改表中的所有列以使其不为空?

因为现在我必须找到每个列的名称和类型来写这样的东西:

    ALTER TABLE testing CHANGE testing_text testing_text VARCHAR(10) NOT NULL;
    ...

这对我来说很重要。

1 个答案:

答案 0 :(得分:3)

快速方法是将alter语句写入文件

select
concat('ALTER TABLE ', c.TABLE_NAME, ' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL;') as alter_statement
into outfile '/tmp/alter.txt'
from information_schema.COLUMNS c
where 
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name';

然后执行文件的内容

source /tmp/alter.txt

你已经完成了......

在游乐场数据库中对它进行了测试,它对我有用,但在执行之前你仍然可能需要仔细检查文件:)

P.S。:我还没有检查过如何处理NULL值。 IIRC你必须有一个默认值吗?现在不确定。请在使用前进行测试。

编辑1:每个表有一个语句:

select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' MODIFY COLUMN ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement
from information_schema.COLUMNS c
where 
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name'
group by c.TABLE_NAME

编辑2:

这个有效

select concat(alter_statement, ';')
into outfile '/tmp/alter.txt'
from (
select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement

from information_schema.COLUMNS c
where 
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'playground'
group by c.TABLE_NAME
) sq

,但group_concat()的篇幅有限,因此如果表中的列太多,可能会出现语法错误。然后你仍然有上面的第一个选项,或者你看看this manual entry

  

结果被截断为group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024.尽管返回值的有效最大长度受到值的约束,但该值可以设置得更高。 max_allowed_pa​​cket的。在运行时更改group_concat_max_len值的语法如下,其中val是无符号整数:

SET [GLOBAL | SESSION] group_concat_max_len = val;