一次增加整个mysql db中的varchar大小

时间:2012-08-08 15:32:56

标签: mysql django

我知道我们可以使用以下命令增加varchar的大小:

alter table TABLE_NAME modify COLUMN_NAME VARCHAR(1024) NOT NULL;

假设我有10个表,每个表有一个公共列,即varchar,其名称为“title”。是否有任何查询我可以执行而不管表名是什么,它会在每个表中更新该字段的大小?

情景:

实际上我使用的BaseModelAbstract,我的很多模特都是从那里继承的。现在我在我的基本模型中将标题长度更新为500。执行Manage.py syncdb将不会反映这些更改。这就是为什么我需要上面的查询。

class TitleAndSlugModel(models.Model):
    title = models.CharField(max_length=500)
    slug = models.SlugField(null=True, blank=True, help_text="The part of the title that is used in the url")

3 个答案:

答案 0 :(得分:0)

不,但如果只有10个左右的表,那真的不是很难做到。

#!/bin/bash
{
  echo "USE some_database;"
  for table in TABLE1 TABLE2 ...
  do
    echo "alter table `$table` modify COLUMN_NAME VARCHAR(1024) NOT NULL;"
  done
} | mysql -h ... -u ... -p ...

答案 1 :(得分:0)

您可以使用information_schema将DDL语句转储到SQL脚本中,然后使用脚本来执行它。假设您的列上没有任何字符集,排序规则或其他替代,您可以执行以下操作:

-- alter all varchar columns named title to be varchar(1024)
select concat('ALTER TABLE ',table_schema,'.',table_name,
' MODIFY COLUMN ',column_name,' VARCHAR(1024)',
if(IS_NULLABLE='YES',' NULL',' NOT NULL'),';"') as the_ddl 
into outfile '/tmp/modify_title_columns.sql'
from information_schema.columns 
where table_schema = '<your_schema>' 
and column_name = 'title'
and data_type = 'varchar';

\. /tmp/modify_title_columns.sql

答案 2 :(得分:0)

我不会直接通过SQL来做...而是在所有模型中更改它(例如max_length = 1024)并使用South进行迁移 - &gt; http://south.readthedocs.org/en/0.7.6/tutorial/part1.html

南== awsomeness

另外,您可能需要将应用转换为使用南 - &gt; http://south.readthedocs.org/en/0.7.6/convertinganapp.html#converting-an-app

等。等