Mysql向视图插入值报错解决办法

今天mysql数据库课堂上学到了视图的操作,在向视图中插入新的值这一操作时,突然报错了,不仅我,全班同学都出现了这个错误。

插入语句

1
2
3
4
5
6
7

插入语句:
INSERT INTO tv_commuser (uid,username,email) values ('u1013','张灵灵','test@qq.com');


报错:
Error Code: 1423. Field of view 'cms.tv_commuser1' underlying table doesn't have a default value

视图中不存在一个默认值?

接着我打开搜索引擎搜索这个错误寻找解决办法,在这里吐槽一下百度,百度了一节课没找到什么有效解决办法,google直接找到解决办法。

排错

首先要讲一下视图的概念:

视图:一种虚拟表,不以存储数据值的形式存在,引用表中的数据,可提高数据库中数据的安全性。

视图的特点:

(1)视图的列可来自于不同的表,是表的抽象和在逻辑意义上建立的新关系。

(2)视图由基本表(实表)产生的表(虚表)。

(3)视图的建立和删除不影响基本表。

(4)对视图内容的更新(添加、删除和修改)直接影响基本表。

(5)当视图来自多个基本表时,不允许添加和删除数据。

从以上信息我们可以得出,这个视图是虚拟的,不是实际存在的,而且可以看做视图是表的副产品,视图和表是紧密联系在一起的。

insert语句执行失败

根本原因就是Field of view 'cms.tv_commuser1' underlying table doesn't have a default value

插入的值中有相应的字段没有设置默认值;

既然这样,我进行了如下操作:

修改字段结构:

 alter table tb_user modify column  uid char(10)  default null ;

 alter table tb_user modify column  username nvarchar(20) default '张三' ;

alter table tb_user modify column  email nvarchar(50)   default 'test@qq.com';

问题来了:

All parts of a PRIMARY KEY must be NOT NULL;

uid作为主键必须为 NOT NULL;

于是我进行以下的操作

重新建立一个视图,不包括uid,插入存在默认值的字段进行测试

1
INSERT INTO tv_commuser (username,email) values ('张灵灵','111@qq.com');

再次报错:

1
Error Code: 1423. Field of view 'cms.tv_commuser1' underlying table doesn't have a default value

陷入了迷茫…….

通过phpmyadmin结合mysql workbench工具查看表和视图的结构,终于发现了问题

在往视图中插入值的时候,其实是先向表中插入值,那么除了你插入的值外,其余字段,如未插入的uid字段,将自动变成null,但uid作为主键,必须是not null,造成了这一矛盾。
你想输入的替代文字

解决办法

把uid字段设置为自增,这样既保证了uid字段not null,又保证了uid中会有一个值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
把原来的表和视图删除,再新建一个

1.
create table tb_user
(
uid int(10) not null auto_increment primary key, # 注意这里uid自增必须为int类型
username nvarchar(20) default null,
password nvarchar(10) default null,
email nvarchar(50) default null,
lever nvarchar(20) default null,
deptcode nvarchar(20) default null,
state char(1) not null default 1
);

insert into tb_user(uid,username,password,email,lever,deptcode,state)
values('1001','张小明','654321','xiaoming@163.com','超级管理员','d1001','1'),('1002','李华','345678','lihua@163.com','普通管理员','d1001','1'),('1003','李小红','234567','xiaohong@163.com','普通管理员','d1001','1'),('1004','张天浩','453124','tianhao@163.com','普通用户','d3001','1'),('1005','李洁','467894','lijie@163.com','普通用户','d5001','1'),('1006','王英','654786','wangying@163.com','超级管理员','d6001','1');




2.
Create view tv_commuser as
Select uid,username,email from tb_user where lever='普通用户';



然后uid自增不用考虑,直接插入视图中剩下的值
INSERT INTO tv_commuser (username,email) values ('张灵灵','111@qq.com');

插入成功!!!!

到这里又出现了新的问题:

通过视图插入的值直接被插入到了表中,而视图还是保持初始值,我在表中给刚才插入的数据加上lever

你想输入的替代文字

这时视图中出现了我插入的值,因为当时我建立这个视图的时候要求的条件是lever='普通用户'

那么就以为着如果视图中没有lever字段,是无法直接向视图中插入值的。

更新数据测试

上节课卡在插入数据之后就一直没往后实验,现在试一下更新数据操作

UPDATE tv_commuser1 SET username="张浩" WHERE username="张天浩";

报错:

Error Code: 1175. You are using safe update mode and you tried to update a ta table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.

一步一错。。。。。。要吐血了。。。。

解决方法如下:

这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令。

1、show variables like ‘SQL_SAFE_UPDATES’;查看开关状态。

2、执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式

继续插入更新数据语句:

UPDATE tv_commuser1 SET username="张浩" WHERE username="张天浩";

插入成功!!!

视图和表同时被修改了

以后我一定把视图和表看做一家人…..