我在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)
。
答案 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 ;