MySQL如何修改字段的默认值和空值

目录
  • MySQL修改字段的默认值和空值
    • 修改字段默认值
    • 修改字段值是否为空
  • MySQL默认值NULL、空值、Empty String的区别
    • 如何选择?
    • 先说结论
    • 区别

MySQL修改字段的默认值和空值

修改字段默认值

  • 修改:
ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值
  • 删除:
ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT

修改字段值是否为空

  • 设为空:
ALTER TABLE 表名 MODIFY 字段名 字段类型 NULL
  • 设为非空:
ALTER TABLE 表名 MODIFY 字段名 字段类型 NOT NULL

MySQL默认值NULL、空值、Empty String的区别

如何选择?

工作一年左右了,发现其实工作中除了需要实现业务代码外,更多的是与数据库打交道。最近因为项目需要,我也逐渐参与进入数据库的设计,从而发现了很多之前没有过多注意的问题。

回想这一年来,写博客的次数屈指可数,现在想重新拾起,所以打算从数据库方面入手,先总结一个比较简单但非常常用的知识点——mysql中字段默认值的问题。

我们可以看到,默认值的设置主要分为三种:

  • 1.空值,空白,即什么都不填,等同于NULL(设计表结构时保存空值会自动变成NULL),当然也可以手动输入默认值。
  • 2.NULL。
  • 3.Empty String,空字符串,可以理解为0字节长度的字符串,等同于单引号''和双引号""。

其中,空值 = NULL,Empty String = 空字符串 = '' = ""。

那么问题来了,当设定某一个字段的默认值的时候,是设定空值、NULL还是Empty String呢?

先说结论

建议不要使用NULL或空值,String类型的字段可以设置默认为Empty String(即空字符串''),Int类型的字段可以设置默认为0。

尤其是使用php做接口开发时,设置字段类型为not null可以避免产生很多问题,如果查询出null数据直接返回给Android或IOS,而移动端又没有进行处理的话,程序就会报错。所以为了避免这种情况,一定要在服务端数据库层面从根源上解决这个问题。

因为空值 = NULL,所以谈论区别时只比较NULL和空字符''串即可。

区别

1、NULL是占用磁盘空间的(并不是数据本身占用空间,而是存储它是否为NULL的标记占用1个字节),而空字符串''是不占用磁盘空间的(它的长度是0字节所以不占用)。

网上找到的相关资料显示NULL是占用磁盘空间的

官方文档说明:NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.

翻译:NULL列需要行中的额外空间来记录它们的值是否为NULL。

即:定义字段类型时,如果允许为NULL,那么就要为每条数据多分配一个字节的空间来表示字段是否为NULL。

直接在mysql中验证即可:

2、字段类型是varchar时可以默认为空字符串,字段类型是int时不可以默认为空字符串,可以设置为0。

3、当字段被设置为not null时,字段就不能是NULL但可以插入空字符串,但空字符串只能插入到字符串类型的字段中,插入其他类型的字段中会报错。而NULL可插入到任何允许为NULL的字段中。

4、SQL语句中对空字符串进行判断时可以使用=、>、<符号;但是对NULL进行判断时必须使用is null或is not null。

5、包含NULL的字段列,如果在查询条件中使用is not null会导致索引失效,但是使用is null索引不会失效。

6、使用count()函数进行统计时,会过滤掉NULL值,但不会过滤掉空字符串。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL null与not null和null与空值''''的区别详解

    相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 我字段类型是not null,为什么我可以插入空值 为毛not null的效率比null高 判断字段不为空的时候,到底要 select * from table where column <> '' 还是要用 select * from table wherecolumn is not null 呢. 带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样. 首先,我们要搞清楚

  • 解决Mysql多行子查询的使用及空值问题

    目录 1 定义 2 多行比较操作符 3 空值问题 3.1 问题 3.2 解决 1 定义 也称为集合比较子查询 内查询返回多行 使用多行比较操作符 2 多行比较操作符 -- 多行子查询 -- IN SELECT employee_id, manager_id, department_id FROM employees WHERE manager_id IN ( -- 在返回集合中查找有没有相同的manager_id在里面 SELECT manager_id FROM employees WHERE

  • MySQL中空值Null和空字符‘‘的具体使用

    目录 1. 空值 Null 和空字符 '' 2. 空值 Null 和空字符 '' 在查询方式上的对比 2.1. 创建 SQL 脚本 2.2. 查询 username 列为空字符串 '' 的所有数据 2.3. 查询 username 列为空值 null 的所有数据 2.4. 查询 username 列不为空值 null 的所有数据 3. 空值 Null 和空字符 '' 在 count() 函数查询的对比 3.1. 查询 username 列数据总数 4. MySQL 中的比较运算符 1. 空值 N

  • 你知道mysql中空值和null值的区别吗

    前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table test (colA varchar(10) not null,colB varchar(10) null); 向test表中插入数据 插入colA为null的数据 insert into test values (null,1); 此时会报错,因为colA列不能为null. 插入colB为null的数据

  • python 在mysql中插入null空值的操作

    python在mysql中插入null空值 sql = "INSERT INTO MROdata (MmeUeS1apId) VALUES (%s)"%'NULL' %s没有引号,可以将"null"中null写进数据库,达到NULL值效果. %s加引号 values就是字符串,导致类型错误,插入错误. sql = "INSERT INTO MROdata (MmeUeS1apId) VALUES ('%s')"%'NULL' 补充:数据库中的空值

  • 区分MySQL中的空值(null)和空字符('')

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符('')和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度是NULL,不确定占用了多少存储空间,但是占用存储空间的 空字符串('')的长度是0,是不占用空间的 通俗的讲: 空字符串('')就像是一个真空转态杯子,什么都没有. 空值(NULL)就像是一个装满空气的杯子,含有东西. 二者虽然看起来都是空的.透明的,但是有着本质的区别. 区别: 在进行count()统计

  • MySQL如何修改字段的默认值和空值

    目录 MySQL修改字段的默认值和空值 修改字段默认值 修改字段值是否为空 MySQL默认值NULL.空值.Empty String的区别 如何选择? 先说结论 区别 MySQL修改字段的默认值和空值 修改字段默认值 修改: ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值 删除: ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT 修改字段值是否为空 设为空: ALTER TABLE 表名 MODIFY 字段名

  • mysql查询的时候给字段赋默认值操作

    需求 查询某个字段的时候需要给一个字段同样的值. 这个值你可以写死,也可以从数据库获取 1.写死值 SELECT mfr_id AS mfrId, mfr_name AS mfrName, IFNULL(NULL, 587694978080178176) AS suppId FROM mater_prod materProd 查询结果 2.从数据库获取值 SELECT mfr_id AS mfrId, mfr_name AS mfrName, IFNULL(NULL, mfr_id) AS su

  • mysql中datetime类型设置默认值方法

    通过navicat客户端修改datetime默认值时,遇到了问题. 数据库表字段类型datetime,原来默认为NULL,当通过界面将默认值设置为当前时间时,提示"1067-Invalid default value for 'CREATE_TM'",而建表的时候,则不会出现这个问题,比如建表语句: CREATE TABLE `app_info1` ( `id` bigint(21) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `a

  • MySQL表字段时间设置默认值

    应用场景 在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间. 在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意记录,而由数据库获取当前时间自动记录修改时间. 在数据库中获取当前时间 oracle:select sysdate from dual; sqlserver:select getdate(); mysql:select sysdate();  select now(); MySQL中时间函数NOW()和SYS

  • 解析MySQL设置当前时间为默认值的方法

    MySQL设置当前时间为默认值的问题我们经常会遇到,下面就为您介绍MySQL设置当前时间为默认值的实现全步骤,希望对您能有所启迪.数据库:test_db1创建表:test_ta1两个字段:id              (自增 且为主键),createtime 创建日期(默认值为当前时间) 方法一.是用alert table语句: 复制代码 代码如下: use test_db1; create table test_ta1( id mediumint(8) unsigned not nulll 

  • django 模型字段设置默认值代码

    我就废话不多说了,大家还是直接看代码吧~ class SitService(models.Model): applicationname = models.CharField(max_length=50,primary_key=True) ip = models.CharField(max_length=50) port = models.IntegerField(default=22) #设置默认值为22 path = models.CharField(max_length=50) 补充知识:

  • MySQL为何不建议使用默认值为null列

    通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引.所以上述说法有漏洞. 着急的人拉到最下边看结论 Preface Null is a special constraint of columns. The columns in table will be added null constrain if you do not define the column with "not null" key words explicit

  • java注解之运行时修改字段的注解值操作

    今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码, 导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个name来匹配 那你表头要动,我这个注解是硬编码 所以就有动态设置这个表头 public class JavaVo{ @Excel(name = "xxx") private String userName; //省略getset方法 } ExcelImportUtil.importExcel

  • MySQL如何为字段添加默认时间浅析

    日期类型区别及用途 MySQL 的日期类型有5个,分别是: date.time.year.datetime.timestamp. 类型 字节 格式 用途 是否支持设置系统默认值 date 3 YYYY-MM-DD 日期值 不支持 time 3 HH:MM:SS 时间值或持续时间 不支持 year 1 YYYY 年份 不支持 datetime 8 YYYY-MM-DD HH:MM:SS 日期和时间混合值 不支持 timestamp 4 YYYYMMDD HHMMSS 混合日期和时间,可作时间戳 支

  • C#不同类型的成员变量(字段)的默认值介绍

    创建类的一个实例时,在执行构造函数之前,如果你没有给成员变量赋初始值,C#编译器缺省将每一个成员变量初始化为他的默认值. 如果变量是方法的局部变量,编译器就会认为在使用该变量之前,代码必须给它显示的设定一个值.否则会发生"使用了未赋值的局部变量"的错误. 对于其他情况,编译器会在创建变量时,把变量初始化为默认值.1.对于整型.浮点型.枚举类型(数值型),默认值为0或0.0.2.字符类型的默认值为\x0000.3.布尔类型的默认值为false.4.引用类型的默认值为null. 如果声时变

随机推荐