Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修改MySQL列以允许NULL而不指定其数据类型?_Mysql_Sql_Syntax_Mysql Workbench - Fatal编程技术网

如何修改MySQL列以允许NULL而不指定其数据类型?

如何修改MySQL列以允许NULL而不指定其数据类型?,mysql,sql,syntax,mysql-workbench,Mysql,Sql,Syntax,Mysql Workbench,我在mysql中有一个表,我想修改一个表以允许列为null 当我在mysql表上进行描述时,我在mysql workbench中看到了以下内容: Field Type Null Key Default Extra 我想为特定列将Null字段设置为YES。下面是我如何尝试的,它工作正常,但在将默认值设置为NULL时是否需要提供其数据类型 ALTER TABLE abc.xyz CHANGE hello hello int(10) unsig

我在mysql中有一个表,我想修改一个表以允许列为null

当我在mysql表上进行描述时,我在mysql workbench中看到了以下内容:

Field       Type        Null        Key     Default     Extra
我想为特定列将
Null
字段设置为
YES
。下面是我如何尝试的,它工作正常,但在将默认值设置为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)。

您走错了方向。将默认值更改为NULL不会“允许”列为NULL:您需要做的是删除列上的“notnull”约束

但要通过脚本重新定义列的可空性,必须继续引用该数据类型。您必须输入以下内容

 ALTER TABLE MyTable MODIFY COLUMN this_column Int NULL;

如果您正在寻找一个直接的DDL语句,则不确定这是否适用,但在MySQL Workbench中,您可以右键单击一个表名,选择“ALTERTABLE…”,它将调出一个表定义GUI。从这里,您可以选择null/notnull(在所有其他选项中),而无需显式列出列的数据类型。只是一句“为了它的价值”…

这可以通过动态语句来实现

用法: 实施:
最好将NULL/notnull视为字段数据类型的一部分(它确实会影响存储)。如果您正在使用Workbench,为什么不使用它的内置功能来更改表呢?不,数据类型需要定义为表定义的一部分;或者它必须从现有的数据集或表继承。您是否希望设置空默认值,但定义的int值可能因表字段而异?(请记住,NULL是默认值,为什么要设置它?)
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 ;