更新MYSQL Tem表中更改的错误列

时间:2017-07-15 00:01:10

标签: mysql sql-update

我有一张临时表

CREATE TEMPORARY TABLE `tmp_horario` (
  `horas_reales` decimal(7,6) unsigned DEFAULT NULL,
  `sede` varchar(3) DEFAULT NULL,
  `periodo` varchar(6) DEFAULT NULL,
  `crn` int(10) unsigned DEFAULT '0',
  `materia` varchar(4) DEFAULT NULL,
  `curso` varchar(5) DEFAULT NULL,
  `titulo` varchar(100) DEFAULT NULL,
  `estatus` varchar(1) DEFAULT NULL,
  `seccion` varchar(3) DEFAULT NULL,
  `nivel` varchar(2) DEFAULT NULL,
  `tipo` varchar(3) DEFAULT NULL,
  `sesion` varchar(2) DEFAULT NULL,
  `horas_clase` decimal(9,3) unsigned DEFAULT NULL,
  `horas_totales` decimal(9,3) unsigned DEFAULT NULL,
  `horas_pago` decimal(9,3) unsigned DEFAULT NULL,
  `horas_contacto` decimal(9,3) unsigned DEFAULT NULL,
  `horas_globales` decimal(9,3) unsigned DEFAULT NULL,
  `hora_inicio` varchar(4) DEFAULT NULL,
  `hora_fin` varchar(4) DEFAULT NULL,
  `lunes` varchar(1) DEFAULT NULL,
  `martes` varchar(1) DEFAULT NULL,
  `miercoles` varchar(1) DEFAULT NULL,
  `jueves` varchar(1) DEFAULT NULL,
  `viernes` varchar(1) DEFAULT NULL,
  `sabado` varchar(1) DEFAULT NULL,
  `no_programado` tinyint(3) unsigned DEFAULT NULL,
  KEY `k_sede` (`sede`),
  KEY `k_crn` (`crn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

我用这样的选择填充记录

select 
s.ssbsect_camp_code sede
, s.ssbsect_term_code periodo
, s.ssbsect_crn crn
...
,0 horas_reales -- This value is filled later
, m.ssrmeet_begin_time hora_inicio
, m.ssrmeet_end_time hora_fin
FROM a table with a lot of joins and complex conditions

一切都好。 但是在下一步中,我用这个

填充计算列
 update tmp_horario h
set h.horas_reales = if(
    h.horas_contacto / h.horas_globales * h.horas_pago > h.horas_contacto
    , h.horas_contacto
    , h.horas_contacto / h.horas_globales * h.horas_pago);

正如您所看到的那样,只有列horas_reales被设置,但不知何故是邻居列" hora_inicio"即使没有设置也没有添加到更新中,它也会被更改。

这是更新之前和之后的行,不需要的列(下一个)的值丢失

horas_reales|hora_inicio | hora_fin
0           |1100        | 1156
to
1           |(empty)     | 1156

如果我不进行更新,问题就会消失(不可能) 或者如果我从de create table中删除"填充",0 horas_reales(可能我只将它用作占位符以便稍后填充)。

所以问题是为什么会发生这种情况,这是一个错误还是我做错了什么?

0 个答案:

没有答案