非空约束(NOT NULL)| 唯一约束(UNIQUE)
空字符串 ’ ’ 和 空值 NULL 有区别
- 向数据表中已存在列添加非空约束 则该列所有值中不能为空值,必须在插入值后才能 添加 非空约束,如果想保留空值,可以用将列表中空值NULL 修改为空字符串 ’ '后添加非空约束。
UPDATE test SET 列名='' WHERE 列名= ;//条件判断 将想保持空值的数值作为条件判断即可
- 向已有多行数据的数据表中添加新的列 不能同时添加唯一约束和非空约束 因为表中已存在多行数据 添加非空约束会默认给向空列值中添加值 如果是数字类型默认填充 0 如果是字符类型默认填充 空字符串 ’ ’;
我们使用sql语句向有多行数据的表中添加新的一列并同时加上两个约束
已存在数据的表:
向表中添加新的列Test3 并加上唯一约束unique和非空约束not null
我们明明还没有给该列数值赋值为什么会显示值重复呢?
我们这次创建列Test3 只用非空约束 试一下
注意:我们新添加的列Test3用的是字符类型 varchar
此时表中多出新的一列 Test3 我们再次添加列Test4 这次用数字类型 仍然加上非空约束
ALTER TABLE test ADD COLUMN Test4 int NOT NULL;
新添加的Test 3 和 Test 4 可以看到Test4我们添加非空约束 并未向其中赋值 已经自动将值填充为0,如果我们添加列 的同时添加 唯一约束 表中已经被非空约束自动填充多行数据为0,数值重复,就会出现刚开始的报错,添加列不成功
我们向表中添加数据会发现 Test3 中圈起来的数值似乎不受非空约束的影响
仍然可以为空,但是我们与方块圈起来的值对比就会发现 我们上面的值并不是空值 里面没有空值的标志Null
Test3中其实已经被填充了空字符串 ’ '来代替值,虽然我们看不到,但是不代表为空。这个样子似乎not null不起作用了 上面数值被填充了空字符串 它可以不被赋值 可以没有实际值,虽然理论上不为空 但实际上仍然可以为空值。
要解决这个问题
首先我们需要 使用sql语句去掉Test3的非空约束
ALTER TABLE test CHANGE COLUMN Test3
Test3 VARCHAR(4) Null;//(Null可省略不写)
执行后我们看到列表似乎没有发生变化 Test3 的值仍然被空字符串’ '填充
仍然不显示Null。
我们用sql语句将 Test3 的空字符串值 ’ '修改为 null值
UPDATE test SET Test3=NULL WHERE Test3='';
执行后我们再看 Test3中的值已经变回了Null
我们将Test3中每一行中都添加上数值后再用sql语句为Test3添加上非空约束即可 一定要都添加上数值 否则会报错
ALTER TABLE test CHANGE COLUMN Test3
Test3 VARCHAR(4) Not NULL;
总结:
- 已有多行数据的表中无法同时添加非空和唯一两种约束
- 在无数据的表中或者只存在一行数据的表中 新添加的列可以同时使用非空约束和唯一约束 此时表中非空约束默认填充后,无重复数值 故可添加唯一约束
- 在非空约束中保留空值将列中该值更改为空字符串’ ’ 即可
- 向已有多行数据的表中添加新的列并使用非空约束,则会将已存在行值填充为空字符串 ’ ’ 或者 0
- 空字符串’'不为空值 不受 非空约束(Not Null)限制,但实际值可以无值 Null为空值需要会受非空约束