咱们在开发中有很多的sql,是不好写的,写完了,还总容易出问题。
所以从现在开始总结,这些SQL语句。
--------------------------------------2019-01-09更新---------------------------------------
这个问题是因为做设计的时候忘了数据的唯一的问题。导致数据出现重复,查询的时候出现了查询的selectOne变成selectList。
1、清除重复的数据
DELETE from gw_run_user_environment where id in (
select a.id from (
select max(id) id from gw_run_user_environment group by
user_id,environment_id having count(*)>1
) a
);
解释:
最里面的SQL“select max(id)……” 是根据字段确定重复数据
第二层的SQL “select a.id……”是为了创建临时表 避免出现1093的错误,错误如下:
1093 - You can't specify target table 'gw_run_user_environment' for update in FROM clause
解释:
Mysql在执行删除操作的时候,不允许出现同样表的子查询,也就是不能在同一表中查询的
数据作为同一表的更新数据。出现以上错误,是因为想将表自身的字段A的值作为被更新
字段B的值而导致的。
给查询的数据命名临时表表明为a 是为了解决MySql的错误1248 ,错误如下:
1248 - Every derived table must have its own alias
解释:
需要给予临时表别名,避免出现子查询的问题。
第三层SQL没啥说的,就是一个删除操作。
解决问题的参考网站:
MySQL之You can't specify target table for update in FROM clause解决办法www.cnblogs.com2、创建 唯一约束
create unique index 唯一约束名称 on 表明(字段1,字段2);
事例:
create unique index user_environment_unqiue
on gw_run_user_environment(user_id,environment_id);
-------------------------------------2019-01-29更新----------------------------------------
最近比较忙,碰到了好多sql,今天就总结一下。
1、注释 Comment
在创建表的时候,一般大家是不加注释的,但是不加注释自己明白,但是让别人来开发的时候就看的一脸懵逼。这不是第一次了,尤其是不加注释的表,不加注释的代码,可是把我坑的不要不要的。。。
- 字段及表的注释
create table student(
id bigint primary key auto_increment comment 'id',
class_id bigint not null comment '班级Id',
curriculum_id varchar(100) not null comment '课程id',
img varchar(500) not null comment '头像',
del_flag tinyint not null DEFAULT 0 comment '删除标志:0-未删除;1-删除'
) comment '学生表';
- 注释的修改
alter table gw_ticket_grant add/modify del_flag
tinyint not null DEFAULT 0 comment '删除标志:0-未删除;1-删除';
我在这提醒大家,建表的时候一定要加注释,不加注释会被人打死的。
2、默认值 DEFAULT
在创建表的时候能使用默认值,一定要使用默认值,尤其是一些状态码,一些时间字段。
- 建表时使用默认值(还是上面的sql)
create table student(
id bigint primary key auto_increment comment 'id',
class_id bigint not null comment '班级Id',
curriculum_id varchar(100) not null comment '课程id',
img varchar(500) not null comment '头像',
del_flag tinyint not null DEFAULT 0 comment '删除标志:0-未删除;1-删除'
) comment '学生表';
- 修改默认值
alter table gw_ticket_grant add/modify del_flag
tinyint not null DEFAULT 0 comment '删除标志:0-未删除;1-删除';
看着是不是很简单啊?但是让大家写80%的人会写错,因为这个单词不常用。
- 设置默认的事假类型为 当前时间
这个也是比较坑,我百度了半天,都说设置默认值为 CURRENT_TIMESTAMP。经过实操,他的默认值第一次插入是0000-00-00 00:00:00。
(2019-09-05 收回上面的话,我直接操作图形化界面是0000-00-00 00:00:00,直接使用insert语句插入,就是系统时间了。详情见 2019-09-25更新,往下翻。)
后来发现Navicat 表设计里面,时间字段下有个选项 “根据当前时间戳更新”,我这选中之后发现成功。现导出sql如下:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id_pk',
`company_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '单位名称',
`voucher` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '凭证',
`remark` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注',
`operation_user` bigint(20) NOT NULL COMMENT '操作人',
`operation_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '操作时间',
`del_flag` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志:0-未删除;1-删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8 COLLATE = utf8_general_ci
COMMENT = '测试表' ROW_FORMAT = Compact;
大家仔细看就会发现,根据当前时间更新时间,不是 DEFAULT CURRENT_TIMESTAMP。
而是 ON UPDATE CURRENT_TIMESTAMP(0)。
-------------------------------------2019-04-26更新----------------------------------------
997结束了,然后又出差一个月,总算是快结束了。今天更新一下遇到的sql。
统计字段的数据是其他表的数据统计
UPDATE gw_topic AS a SET comment_count =
(select count(*) FROM gw_topic_conmment WHERE topic_id=a.topic_id);
解释:帖子表中有一个字段叫评论总数,而这个评论总数正好是评论表中的评论统计。一般正式环境,只要你做好业务(添加评论时候评论总数+1)就不会出现数量不一致的问题。但是开发环境则很容易出现这些问题。就需要进行数量统计的更新。
-------------------------------------2019-09-05更新----------------------------------------
关于之前【时间自动更新的字段属性】再次修改一下 两个属性的区别:
1、DEFAULT CURRENT_TIMESTAMP:默认是第一次插入是系统时间,用于的字段:创建时间等等
2、ON UPDATE CURRENT_TIMESTAMP:默认插入的时间是系统时间,意味着每次修改本条数据自动更新时间为系统时间,应用字段:更新时间、操作时间等字段
如果建表使用属性2更新时间且设置字段不能为空,InnoDB数据库会让你设置默认值。否则会报错误1067,如下图:

但是可以两个属性一起使用,修改后如下图:
