Have You Ever Wondered About the Difference Between NOT NULL and DEFAULT?
When writing DDL in SQL, you can specify a couple of constraints on columns, like NOT NULL
or DEFAULT
constraints.
Some people might wonder, if the two constraints are actually redundant, i.e. is it still necessary to specify a NOT NULL
constraint, if there is already a DEFAULT
clause?
The answer is: Yes!
Yes, you should still specify that NOT NULL
constraint. And no, the two constraints are not redundant.
The answer I gave here on Stack Overflow wraps it up by example, which I’m going to repeat here on our blog:
DEFAULT
is the value that will be inserted in the absence缺乏 of an explicit明确的 value in an insert / update statement. Lets assume, your DDL did not have the NOT NULL
constraint:
ALTER TABLE tbl
ADD COLUMN col VARCHAR(20)
DEFAULT "MyDefault"
Then you could issue these statements
-- 1. This will insert "MyDefault"
-- into tbl.col 第一个插入记录,没有指定col的值
INSERT INTO tbl (A, B)
VALUES (NULL, NULL); -- 2. This will insert "MyDefault"
-- into tbl.col
INSERT INTO tbl (A, B, col) 第二个插入记录,指定col为Default
VALUES (NULL, NULL, DEFAULT); -- 3. This will insert "MyDefault"
-- into tbl.col
INSERT INTO tbl (A, B, col)
DEFAULT VALUES; -- 4. This will insert NULL
-- into tbl.col 第四个插入记录,指定col为null,不使用默认值
INSERT INTO tbl (A, B, col)
VALUES (NULL, NULL, NULL);
Alternatively, you can also use DEFAULT in UPDATE statements, according to the SQL-1992 standard:
-- 5. This will update "MyDefault"
-- into tbl.col
UPDATE tbl SET col = DEFAULT; -- 6. This will update NULL
-- into tbl.col
UPDATE tbl SET col = NULL;
Note, not all databases support all of these SQL standard syntaxes.
Adding the NOT NULL constraint will cause an error with statements 4, 6, while 1-3, 5 are still valid statements.
So to answer your question:
No, NOT NULL and DEFAULT are not redundant
That’s already quite interesting, so the DEFAULT
constraint really only interacts with DML statements and how they specify the various columns that they’re updating. The NOT NULL
constraint is a much more universal guarantee, that constraints a column’s content also “outside” of the manipulating DML statements.
For instance, if you have a set of data and then you add a DEFAULT
constraint, this will not affect your existing data, only new data being inserted.
If, however, you have a set of data and then you add a NOT NULL
constraint, you can actually only do so if the constraint is valid – i.e. when there are no NULL
values in your column. Otherwise, an error will be raised.
Have You Ever Wondered About the Difference Between NOT NULL and DEFAULT?的更多相关文章
- 【问题】Difference between ">/dev/null 2>&1" and "2>&1 >/dev/null"
https://www.unix.com/shell-programming-and-scripting/125947-difference-between-dev-null-2-1-2-1-dev- ...
- MySQL入门手册
本文内容摘自MySQL5.6官方文档,主要选取了在实践过程中所用到的部分文字解释,力求只摘录重点,快速学会使用MySQL,本文所贴代码地方就是我亲自练习过的代码,凡本文没有练习过的代码都没有贴在此处, ...
- 编写更少量的代码:使用apache commons工具类库
Commons-configuration Commons-FileUpload Commons DbUtils Commons BeanUtils Commons CLI Commo ...
- libevent源码分析(一)
分析libevent的源代码,我的想法的是先分析各种结构体,struct event_base.struct event,然后是event_base_new函数.event_new函数.event_a ...
- mysql命令行工具
mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...
- but this usually doesn’t gain you anything.
High Performance My SQL, Third Edition Date and Time Types My SQL has many types for various kinds o ...
- platanus
nohup platanus assemble -o Larrrea -f ../unknown_NoIndex_L000_R1.fastq ../unknown_NoIndex_L000_R2.f ...
- windows 下使用 zip安装包安装MySQL 5.7
以下内容参考官方文档:http://dev.mysql.com/doc/refman/5.7/en/windows-start-command-line.html 解压缩zip到D:\mysql-5. ...
- iOS处理XMl提供GDataXMLNode下载的链接
GDataXMLNode .好东西,处理xml 在iOS 中使用.可以编辑和读取Xml文档.支持Xpath.这个很好. GDataXMLNode.h GDataXMLNode.m 文件很不好找啊. / ...
随机推荐
- python核心编程学习记录之基础知识
虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...
- django models使用学习记录
如何更新单个数据 example = User.objects.get(id=1) example.is_acitve=1 example.save() 如何更新多个数据 examples = Use ...
- 前后台数据传输两种方式:servlet、Controller
1.Servlet: 1.1从jsp页面跳转到Servlet控制器中,通过request.getParameter()来获取参数. 1.2// 把注册成功的用户对象保存在session中 ...
- 忘记windows的登陆密码
http://user.qzone.qq.com/372806800/blog/1342261571
- 连接ssh反应很慢,卡,延迟
1.关闭DNS反向解析在linux中,默认就是开启了SSH的反向DNS解析,这个会消耗大量时间,因此需要关闭.# vi /etc/ssh/sshd_configUseDNS=no 在配置文件中,虽然U ...
- javaWeb 使用jsp开发 foreach 标签
1.jsp代码 测试数据 <% List<String> list = new ArrayList<String>(); list.add("aaa" ...
- HDU 3078:Network(LCA之tarjan)
http://acm.hdu.edu.cn/showproblem.php?pid=3078 题意:给出n个点n-1条边m个询问,每个点有个权值,询问中有k,u,v,当k = 0的情况是将u的权值修改 ...
- java 基本类型之间的转换
基本数据类型从低级到高级是:byte short int long float double ,char 类型比int 类型之后的都要低 下面通过一个例子说明: import javax.swing ...
- sql排序 去除默认升降序排序case方法////遍历数据库所有表及统计表数据总数
case排序法: end 还有EXEC法 可以网上查 SQLServer遍历数据库所有表及统计表数据总数: DECLARE @TableName varchar(); CREATE TABLE #Ge ...
- Doubles 分类: POJ 2015-06-12 18:24 11人阅读 评论(0) 收藏
Doubles Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19954 Accepted: 11536 Descrip ...