如何在MySQL中向现有列添加非空约束

206
我有一个名为“Person”的表,其中包含以下列名。
P_Id(int),
LastName(varchar),
FirstName (varchar).

我忘记给 P_Id 添加 NOT NULL 约束。

现在我尝试使用以下查询来向名为 P_Id 的现有列添加 NOT NULL 约束:

1. ALTER TABLE  Person MODIFY  (P_Id NOT  NULL);
2. ALTER TABLE Person ADD CONSTRAINT NOT  NULL NOT NULL (P_Id);

我遇到了语法错误...

3个回答

329

使用一个ALTER TABLE... MODIFY...查询,并在您现有的列定义中添加NOT NULL。例如:

ALTER TABLE Person MODIFY P_Id INT(11) NOT NULL;

需要注意的是,在使用MODIFY查询时,您需要重新指定完整的列定义。如果您的列具有例如DEFAULT值或列注释,则需要在MODIFY语句中指定它以及数据类型和NOT NULL,否则它将丢失。为了防止这种意外情况的发生,最安全的做法是从SHOW CREATE TABLE YourTable查询的输出中复制列定义,将其修改为包括NOT NULL约束,并将其粘贴到您的ALTER TABLE... MODIFY...查询中。


4
@Positive,为什么你写的是INT(11)而不是只写INT?数字11有什么作用? - Suzanne Soy
2
11只是一个例子,它设置了P_Id的长度。我不确定是否有必要再次添加它,即使您可能根本不想更改它。 - Gerard
2
@Pacerier,使用change命令可以修改列名。 - Javier P
1
@Victor,Oracle 也支持 MODIFY。而 PostgreSQL 不支持 CHANGE,但提供了 ALTER [COLUMN] 语句。 - Mr. Deathless
1
自己注意:结构化查询语言并不是标准查询语言... - Dmytro
显示剩余5条评论

25

试一试,你会知道change和modify之间的区别。

ALTER TABLE table_name CHANGE curr_column_name new_column_name new_column_datatype [constraints]

ALTER TABLE table_name MODIFY column_name new_column_datatype [constraints]
  • 您可以使用CHANGE更改特定列的名称和数据类型。
  • 您可以使用MODIFY修改特定列的数据类型。但是,您无法使用此语句更改列名。

希望我详细解释清楚了。


5
您执行了“修改”操作以进行更改,但无法执行逆操作吗? - Navrattan Yadav
1
奇怪的是,我在更改/修改一个我命名为null_heart_rate_count的列时(MySQL 5.6,Workbench 6.3),出现了错误#1138,无效使用NULL值。我不得不删除并添加该列。 - William T. Mallard
@NavrattanYadav 我认为他的意思是重命名,而不是反转。 - shaahiin
2
@WilliamT.Mallard 我也遇到了同样的错误。在我的情况下,是因为该列已经在一行中包含了一个NULL值。将值更改为非NULL值后,查询成功执行了。 - Paolo42

15

我想补充一下:

更新后,比如说:

ALTER TABLE table_name modify column_name tinyint(4) NOT NULL;
如果你得到了。
ERROR 1138 (22004): Invalid use of NULL value

确保您通过首先更新表格来在相关列中设置值(以便它不为null)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接