我正在开发一个有10年历史的web应用(!!!)&目前在本地运行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查询:
更改表格 dbname
. processes_history
添加索引 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”类型,所以它不起作用。
但我就是不明白解决这个问题的办法是什么。改为使用时间戳类型?
有没有办法解决这个问题而不破坏结构(至少现在)我完成整个web应用程序?很多事情都依赖于这个表,我真的不想做一些冒险的事情来按我想要的方式索引它。
3条答案
按热度按时间hkmswyz61#
暂时使有问题的列可以为null也解决了这个问题。
5us2dqdw2#
更改sql\U模式解决了问题:
我比较了MySQL5.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
套(https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date).在5.6:只是
NO_ENGINE_SUBSTITUTION
(MySQL5.6手册)https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-模式设置)为了让我的本地mysql(5.7)与生产版本(5.6)同步工作,我只需将mysql\u mode设置为
NO_ENGINE_SUBSTITUTION
```SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
igsr9ssn3#
您需要切换到innodb——下一个版本(8.0)已经删除了myisam。
在5.6左右,对
TIMESTAMP
改变。想想你有什么价值观,你需要什么价值观。PARTITIONing
很少提高绩效;什么问题驱使你使用它?