如何在不指定数据类型的情况下修改MySQL列以允许NULL?

时间:2015-08-13 20:12:21

标签: mysql sql syntax mysql-workbench

我在mysql中有一个表,我想改变一个表以允许列为空。

当我在mysql表上描述时,我在mysql workbench中看到了这些东西:

Field       Type        Null        Key     Default     Extra

我想将Null字段设置为特定列的YES。这是我正在尝试哪种方法正常,但我需要提供其数据类型,同时将DEFAULT设置为NULL?

ALTER TABLE abc.xyz CHANGE hello hello int(10) unsigned DEFAULT NULL;
ALTER TABLE abc.xyz CHANGE world world int(10) unsigned DEFAULT NULL;

有没有其他方法可以选择列名并将默认值设置为NULL而不是使用其数据类型?我不想在将其默认值设置为NULL时提供int(10)

3 个答案:

答案 0 :(得分:5)

你有点走错了路。将默认值更改为NULL不允许"允许"该列为null:您需要做的是删除" NOT NULL"对列的约束。

但是要通过脚本重新定义列的可为空性,您必须继续引用数据类型。您必须输入类似

的内容
 ALTER TABLE MyTable MODIFY COLUMN this_column Int NULL;

答案 1 :(得分:2)

如果您正在寻找直接的DDL语句,不确定是否适用,但在MySQL Workbench中,您可以右键单击表名,选择"更改表..."它将启动一个表定义GUI。从那里,您可以选择null / not null(在所有其他选项中),而无需显式列出列的数据类型。只是一个"它的价值和#34; ...

答案 2 :(得分:0)

这可以借助动态语句来完成。

用法

CALL sp_make_nullable('schema_name', 'table_name', 'column_name', TRUE);

实施

DELIMITER $$
create procedure eval(IN var_dynamic_statement text)
BEGIN
    SET @dynamic_statement := var_dynamic_statement;
    PREPARE prepared_statement FROM @dynamic_statement;
    EXECUTE prepared_statement;
    DEALLOCATE PREPARE prepared_statement;
END;

DELIMITER ;

DELIMITER $$
create procedure sp_make_nullable(IN var_schemaname varchar(64), IN var_tablename varchar(64),
                                  IN var_columnname VARCHAR(64), IN var_nullable BOOLEAN)
BEGIN
    DECLARE var_column_type LONGTEXT DEFAULT (SELECT COLUMN_TYPE
                                              FROM information_schema.COLUMNS
                                              WHERE TABLE_SCHEMA = var_schemaname
                                                AND TABLE_NAME = var_tablename
                                                AND COLUMN_NAME = var_columnname);

    DECLARE var_nullable_prefix VARCHAR(64) DEFAULT '';

    IF NOT var_nullable THEN
        SET var_nullable_prefix := 'NOT';
    end if;

    CALL eval(CONCAT('
        ALTER TABLE ', var_schemaname, '.', var_tablename,
        ' MODIFY ', var_columnname, ' ', var_nullable_prefix, ' NULL
    '));
end$$

DELIMITER ;