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