是否有一个简单的命令来修改表中的所有列以使其不为空?
因为现在我必须找到每个列的名称和类型来写这样的东西:
ALTER TABLE testing CHANGE testing_text testing_text VARCHAR(10) NOT NULL;
...
这对我来说很重要。
答案 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_packet的。在运行时更改group_concat_max_len值的语法如下,其中val是无符号整数:
SET [GLOBAL | SESSION] group_concat_max_len = val;