【问题标题】:mySQL DROP NOT NULL not working [closed]mySQL DROP NOT NULL 不起作用[关闭]
【发布时间】:2012-10-04 02:56:51
【问题描述】:
我正在阅读 django 的权威指南,其中有一行我必须告诉 mySQL 列可以具有空值。
本书使用了这个
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
但是当我运行它时,我收到了这条消息:
ERROR 1064 (42000):您的 SQL 语法有错误;检查
与您的 MySQL 服务器版本相对应的手册
在第 1 行的“NOT NULL”附近使用的语法
发生了什么事?我是初学者,所以无法轻松诊断 mySQL 错误。
【问题讨论】:
标签:
mysql
django
mysql-error-1064
【解决方案1】:
这个对于 MySQL 5.5 非常有效
ALTER TABLE books_book CHANGE publication_date publication_date DATE;
【解决方案2】:
最简约的正确语法是:
ALTER TABLE books_book ALTER COLUMN publication_date column_type NULL;
将 column_type 替换为当前的 publication_date 类型,如果您对该列有任何其他说明符,您也应该添加这些说明符。顾名思义,假设它是一个日期:
ALTER TABLE books_book ALTER COLUMN publication_date DATE NULL;
您可以查看如何使用 mysqldump 或通过导出表从管理界面重新创建列(或如 @mbarthelemy 建议的 show create table books_book;),从那里获取创建列的语法并在 @987654324 中使用它@,但将 NOT NULL 替换为 NULL。
【解决方案3】:
您只能将DROP 与列名称、索引名称和约束名称一起使用,但不能与数据的条件 一起使用。我不认为NOT NULL 是一个命名约束,因此是错误。
您不能使用 ALTER COLUMN 删除列的 NOT NULL 定义,而是删除到 DROP DEFAULT。
示例:
ALTER TABLE books_book ALTER COLUMN publication_date DROP DEFAULT;
ALTER TABLE books_book ALTER COLUMN publication_date SET DEFAULT TODAY();
如果您要删除列上的NOT NULL 定义,您应该使用MODIFY 或CHANGE 语法和ALTER TABLE。
示例:
ALTER TABLE books_book MODIFY COLUMN publication_date DATE NULL;
ALTER TABLE books_book CHANGE COLUMN publication_date new_name DATE NULL;
参考:ALTER TABLE Syntax。
【解决方案4】:
是的,这个语法是错误的。
如果您只想让列有时包含空值,那么这已经是默认行为了。
检查你的表定义是否禁止空值
show create table
如果它没有默认行为,您将看到 UNIQUE 和/或 NOT NULL 约束。