1. 复现问题
今天在修改表application_apply
中的create_gateway_application
字段的默认值,却报出如是问题Invalid use of NULL value
。
因为application_apply
是公司的数据表,不便演示。
- 因而,我在本地数据库中创建
test
数据表,并增加id
、name
和address
字段,如下代码所示:
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)
- 向
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)
- 查询
test
表中的数据,如下代码所示:
mysql> select * from test;
+----+----------+--------------------------+
| id | name | address |
+----+----------+--------------------------+
| 1 | 陈希尔 | 江苏省无锡市新吴区旺庄路 |
| 2 | 念兮为美 | NULL |
+----+----------+--------------------------+
2 rows in set (0.00 sec)
- 此时,我若设置
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. 解决问题
使用如下方式解决问题:
- 将出错的列内容复制到新列中并删除出错列。
- 创建名为
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
- 修改新列名称为出错列
- 修改
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