sql修改时间语句_常用SQL语句(时常修改)

咱们在开发中有很多的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.com

2、创建 唯一约束

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,如下图:

8df0aa674d7ea5f34ad10319f42f115b.png
InnoDB引擎 ON UPDATE CURRENT_TIMESTAMP属性

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

6691a2c6342668a425ad8b9bc489cd20.png
两个时间属性一起使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值