0

我在 stackexchange 上看到了一个类似的问题,但它的答案并没有给我正确的结果。

出于演示目的,我有一个PURCHASES带有列的简单表PURCHASE_NUM, PURCHASE_DATECUSTOMER_ID. 我想对CUSTOMER_ID表强制执行非空约束。我尝试了以下方法:

ALTER TABLE PURCHASES MODIFY CUSTOMER_ID char NOT NULL;

该语法很好,但随后我插入以下内容:INSERT INTO PURCHASES VALUES (333, NULL, NULL);并且添加元组没有问题。为什么没有强制执行约束?在添加约束之前该列中已经存在 NULL 值会影响事物吗?

谢谢

编辑 DESCRIBE PURCHASES;对感兴趣的列说以下内容:

Field, Type, Null, Key, Default, Extra
CUSTOMER_ID, char(5), YES, , NULL, 
4

3 回答 3

0

也许您必须更改为

ALTER TABLE PURCHASES MODIFY  CUSTOMER_ID char NOT NULL;
于 2012-09-08T16:53:42.573 回答
0

您的ALTER命令不起作用,该Null列仍然显示YES。您的ALTER命令语法看起来很好,它应该可以工作。检查您的输入,然后重试。

您的客户 ID 真的只是一个字符吗?

于 2012-09-08T17:11:30.347 回答
0

根据手册,将数据输入到NOT NULL没有显式DEFAULT子句的列中会将列设置为NULL. 因此,您ALTER的列应该包含一个DEFAULT. 从 4.0 文档开始:

隐式默认值定义如下:

对于数字类型,默认值为0,但对于使用属性声明的整数或浮点类型AUTO_INCREMENT,默认值为序列中的下一个值。

对于除 之外的日期和时间类型TIMESTAMP,默认值为该类型的相应“零”值。对于TIMESTAMP表中的第一列,默认值为当前日期和时间。请参见第 10.3 节“日期和时间类型”。

对于 以外的字符串类型ENUM,默认值为空字符串。对于 ENUM,默认是第一个枚举值。

于 2012-09-08T17:17:06.250 回答