今天mysql数据库课堂上学到了视图的操作,在向视图中插入新的值这一操作时,突然报错了,不仅我,全班同学都出现了这个错误。
插入语句
1 |
|
视图中不存在一个默认值?
接着我打开搜索引擎搜索这个错误寻找解决办法,在这里吐槽一下百度,百度了一节课没找到什么有效解决办法,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="张天浩";
插入成功!!!
视图和表同时被修改了
以后我一定把视图和表看做一家人…..