Индексирование: недопустимое значение по умолчанию для «[столбца]» - PullRequest
0 голосов
/ 13 мая 2018

Я работаю над 10-летним веб-приложением (!!!) и в настоящее время работаю с mysql локально, версия 5.7.

Это таблица, над которой я сейчас работаю:

CREATE TABLE `processes_history` (
  `p_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `exec_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `feature` varchar(100) NOT NULL DEFAULT '',
  `macro` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  `ts` date NOT NULL DEFAULT '0000-00-00',
  `seen` int(10) UNSIGNED NOT NULL DEFAULT '1',
  `seen_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `focus` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `focus_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `mouse` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `keyboard` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `interactive` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `interactive_time` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `last_seen` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE (TO_DAYS(`ts`))
(
PARTITION p0 VALUES LESS THAN (736695) ENGINE=MyISAM,
PARTITION p201701 VALUES LESS THAN (736726) ENGINE=MyISAM,
PARTITION p201702 VALUES LESS THAN (736754) ENGINE=MyISAM,
PARTITION p201703 VALUES LESS THAN (736785) ENGINE=MyISAM,
PARTITION p201704 VALUES LESS THAN (736815) ENGINE=MyISAM,
PARTITION p201705 VALUES LESS THAN (736846) ENGINE=MyISAM,
PARTITION p201706 VALUES LESS THAN (736876) ENGINE=MyISAM,
PARTITION p201707 VALUES LESS THAN (736907) ENGINE=MyISAM,
PARTITION p201708 VALUES LESS THAN (736938) ENGINE=MyISAM,
PARTITION p201709 VALUES LESS THAN (736968) ENGINE=MyISAM,
PARTITION p201710 VALUES LESS THAN (736999) ENGINE=MyISAM,
PARTITION p201711 VALUES LESS THAN (737029) ENGINE=MyISAM,
PARTITION p201712 VALUES LESS THAN (737060) ENGINE=MyISAM,
PARTITION p201801 VALUES LESS THAN (737091) ENGINE=MyISAM,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE=MyISAM
);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `processes_history`
--
ALTER TABLE `processes_history`
  ADD PRIMARY KEY (`p_id`,`exec_id`,`feature`,`ts`),
  ADD KEY `ts` (`ts`),
  ADD KEY `exec_ts` (`exec_id`,`ts`),
  ADD KEY `last_seen` (`last_seen`);

Я получаю сообщение об ошибке при добавлении индекса в p_id, exec_id, ts:

ALTER TABLE `dbname`.`processes_history` ADD INDEX `p_id,exec_id,ts` (`p_id`, `exec_id`, `ts`);

Ошибка SQL-запроса:

ALTER TABLE dbname. processes_history ADD INDEX p_id,exec_id,ts (p_id, exec_id, ts) MySQL сказал: Документация

1067 -Неверное значение по умолчанию для 'ts'

После этого сообщения: https://dba.stackexchange.com/questions/192186/on-create-index-invalid-default-value

Из того, что я понял, использование 0000-00-00 в качестве значения по умолчанию нарушает тип 'date', ивот почему это не работает.

Но я просто не мог понять, как можно решить эту ситуацию.Вместо этого используется тип TIMESTAMP?

Есть ли способ решить эту проблему, не нарушая структуру (пока, по крайней мере), пока я не закончу все веб-приложение?Многое зависит от этой таблицы, и я не хочу делать что-то рискованное, чтобы проиндексировать его так, как я хочу.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018
  • Вам нужно перейти на InnoDB - В следующем выпуске (8.0) удален MyISAM.
  • Где-то около 5.6, обработка по умолчанию для TIMESTAMP изменилась.Подумайте, какие значения у вас есть и какие вам нужны.
  • PARTITIONing редко повышает производительность;какой запрос заставил вас его использовать?
0 голосов
/ 13 июня 2018

Временное превращение рассматриваемого столбца в nullable также решает эту проблему.

0 голосов
/ 14 мая 2018

Изменение SQL_mode решило проблему:

Я сравнил MySQL 5.7 и 5.6, и похоже, что 5.7 имеет ограничения по умолчанию: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION set (https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date).

А на 5.6: просто NO_ENGINE_SUBSTITUTION (mysql 5.6 инструкция https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-setting)

Чтобы мой локальный mysql (5.7) работал синхронно с рабочей версией (5.6), мне просто нужно было установить mysql_mode на NO_ENGINE_SUBSTITUTION

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Вы можете просмотреть post на db-stackexchange с дополнительной информацией.

...