解决 ‘Invalid use of NULL value‘ 问题

导读:本篇文章讲解 解决 ‘Invalid use of NULL value‘ 问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 复现问题

今天在修改表application_apply中的create_gateway_application字段的默认值,却报出如是问题Invalid use of NULL value

因为application_apply是公司的数据表,不便演示。

  1. 因而,我在本地数据库中创建test数据表,并增加idnameaddress字段,如下代码所示:
CREATE TABLE `test` (
	`id` INT ( 0 ) NOT NULL auto_increment,
	`name` VARCHAR ( 255 ) NOT NULL,
	`address` VARCHAR ( 255 ) NULL,
	PRIMARY KEY ( `id` ) 
);
Query OK, 0 rows affected (0.05 sec)
  1. test表中增加两条数据,如下代码所示:
insert into test(name,address) value('陈希尔','江苏省无锡市新吴区旺庄路');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test(name) value('念兮为美');
Query OK, 1 row affected (0.01 sec)
  1. 查询test表中的数据,如下代码所示:
mysql> select * from test;
+----+----------+--------------------------+
| id | name     | address                  |
+----+----------+--------------------------+
|  1 | 陈希尔   | 江苏省无锡市新吴区旺庄路     |
|  2 | 念兮为美 | NULL                      |
+----+----------+--------------------------+
2 rows in set (0.00 sec)
  1. 此时,我若设置test表中的address字段的默认值,并修改属性为not null,如代码所示:
mysql> ALTER TABLE `test` 
	MODIFY COLUMN `address` varchar(255)  NOT NULL DEFAULT '江苏省无锡市经开区';

却报出如下错误:

在这里插入图片描述

2. 分析问题

将上述报出的问题Invalid use of NULL value翻译成中文为无效使用空值,为什么说是无效使用空值呢?

正如上文中查出的address 值,如下图所示:

在这里插入图片描述

原来test表已存在的address 列存在为null的值,故而,与not null或者默认值的设置冲突(查到的原因)。

我认为在新建数据表时,将已设置该列address 的表结构。因而,在后续进行更改时会与之前的设置发生冲突(至于为什么这里更改时不能更改,我也没太理解),因为之前我在新建表的时候将编号列的结构属性设置了。

鉴于无法设置为非空,所以通过新建列并设置好not null,便可以成功。

3. 解决问题

使用如下方式解决问题:

  1. 将出错的列内容复制到新列中并删除出错列。
  • 创建名为address_cp的新列

mysql> ALTER TABLE `test` ADD COLUMN `address_cp` varchar(255) NOT NULL DEFAULT '江苏省无锡市经开区' COMMENT '地址' AFTER `address`;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

  • 使用ifnull()函数将address列的所有值复制到address_cp'
mysql> update test set address_cp = ifnull(address,'江苏省无锡市经开区');
Query OK, 1 row affected (0.01 sec)
Rows matched: 3  Changed: 1  Warnings: 0
  • 删除address
mysql> alter table test drop address;
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0
  1. 修改新列名称为出错列
  • 修改address_cp列为address
mysql> alter table test change column address_cp address varchar(255) NOT NULL DEFAULT '江苏省无锡市经开区' COMMENT '地址';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
  • 新增数据时,不输入address值,其会采用默认值
mysql> insert into test(name) value('奔驰cc');
Query OK, 1 row affected (0.00 sec)
  • 查看数据,第3行的address就是采用默认值
mysql> select * from test;
+----+----------+--------------------------+
| id | name     | address                  |
+----+----------+--------------------------+
|  1 | 陈希尔   | 江苏省无锡市新吴区旺庄路 |
|  2 | 念兮为美 | 江苏省无锡市经开区       |
|  3 | 奔驰cc   | 江苏省无锡市经开区       |
+----+----------+--------------------------+
3 rows in set (0.00 sec)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99125.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!