0

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

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

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

这对我来说是很多工作。

4

1 回答 1

4

一种快速的方法是将您的更改语句写入文件

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

你完成了......

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

PS:我还没有检查 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()长度有限,因此如果表中的列过多,可能会出现语法错误。然后你仍然有上面的第一个选项,或者你看看这个手​​册条目

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

SET [GLOBAL | SESSION] group_concat_max_len = val;
于 2013-09-12T13:13:58.670 回答