Mysql 索引:无效的默认值为';[专栏]';
我正在开发一个已有10年历史的web应用程序(!!!) &目前正在本地运行mysql,版本为5.7 这是我目前正在处理的表:Mysql 索引:无效的默认值为';[专栏]';,mysql,indexing,mysql-5.7,Mysql,Indexing,Mysql 5.7,我正在开发一个已有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 '',
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\u id、exec\u id、ts添加索引时,我不断收到一个错误:
ALTER TABLE `dbname`.`processes_history` ADD INDEX `p_id,exec_id,ts` (`p_id`, `exec_id`, `ts`);
错误SQL查询:
ALTER TABLEdbname
处理历史记录
添加索引p\U id、exec\U id、ts
(p_id
,exec_id
,ts
)MySQL说:文档
1067-无效的“ts”默认值
在这篇文章之后:
据我所知,使用0000-00-00
作为默认值会破坏“日期”类型,这就是它不起作用的原因
但我就是不明白这种情况的解决方案是什么。改为使用时间戳类型
有没有一种方法可以在不破坏结构的情况下解决这个问题(至少现在是这样)在我完成整个web应用程序的时候?很多事情都依赖于该表,我确实不想做一些冒险的事情,以我想要的方式对其进行索引。更改SQL\u模式解决了问题: 我比较了MySQL 5.7和5.6,似乎5.7有默认的限制:
只有完整的分组依据、严格的转换表、没有零的输入日期、没有零的日期、按零划分的错误、没有自动创建用户和没有引擎替换
set()
在5.6上:只需无引擎替换
(mysql 5.6手册)
为了让我的本地mysql(5.7)与生产版本(5.6)同步工作,我只需NO\u ENGINE\u SUBSTITUTION
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
您可以查看有关db stackexchange的更多信息。- 您需要更改为InnoDB——下一个版本(8.0)已删除MyISAM
- 大约在5.6的某个地方,
的默认处理发生了变化。想想你有什么价值观,你需要什么价值观TIMESTAMP
很少提高性能;什么问题促使你使用它分区
0000-00-00
作为ts
日期列的默认值是什么?让它可以为null,并适当地处理它。除了索引的这种表现形式是一个问题外,我似乎还记得还有其他可能发生的问题。最短日期是1000-01-01 00:00:00
,因此可以使用它作为默认值,或者按照Tim的建议使列为空。@TimBiegeleisen我会,但在我之前工作过那个数据库的人不知为什么把它设为主键。这就是我在尝试将其设置为NULL时得到的结果:queryerror:#1171-主键的所有部分都不能为NULL;如果密钥中需要NULL,请改用UNIQUE
:这是唯一的解决方案吗?