自动获得时间函数
在 MySQL 中,当您设置一个 DATETIME
或 TIMESTAMP
类型的列默认值为 current_timestamp
时,您需要确保该默认值是有效的,并且您使用的 MySQL 版本支持将 current_timestamp
作为默认值。
在较老的 MySQL 版本中(如 5.5 版本之前),DATETIME
类型的列并不支持 DEFAULT CURRENT_TIMESTAMP
,而只有 TIMESTAMP
类型的列支持这一默认值。如果您的 MySQL 版本较新(5.6 及以上),则这两种类型都支持 CURRENT_TIMESTAMP
作为默认值。
针对您提供的 SQL 语句中的错误 #1067 - Invalid default value for 'creation_date'
,可能的解决方法如下:
- 如果您的 MySQL 版本是 5.6 或以上,确保您正确地使用了
CURRENT_TIMESTAMP
:
`creation_date` datetime DEFAULT CURRENT_TIMESTAMP,
- 如果您的 MySQL 版本低于 5.6,您可以更改列类型为
TIMESTAMP
:
`creation_date` timestamp DEFAULT CURRENT_TIMESTAMP,
- 如果您希望继续使用
DATETIME
类型并且不能升级 MySQL 版本,您可以在应用程序逻辑中处理时间戳的插入,而不是依赖数据库的默认值。
另外,请检查您的 MySQL 服务器的 SQL 模式设置。某些模式(如 NO_ZERO_DATE
)可能会影响 DATETIME
列和默认值。
您可以使用以下命令查看当前的 SQL 模式:
SELECT @@sql_mode;
如果发现 NO_ZERO_DATE
在结果中,您可以通过更改 SQL 模式来移除它。
最后,如果您做了上述的更改并且仍然遇到问题,那可能是其它的配置或语法错误引起的。确保您的语句符合您当前 MySQL 版本的语法要求。
VARCHAR字符串255改为190个字符
错误 #1071 - Specified key was too long; max key length is 767 bytes
发生在尝试创建一个索引,但索引的长度超过了InnoDB表允许的最大字节长度。在MySQL的早期版本中,InnoDB表每个索引的最大长度为767字节。
此限制对于使用utf8mb4字符集的列尤其需要注意,因为每个字符最多可以占用4个字节,这意味着一个VARCHAR(255)的列就可能达到1020字节(255字符 * 4字节/字符),超过767字节的限制。
为了解决这个问题,你有几个选择:
- 减少字符列的大小:
缩减VARCHAR
字段的长度,以确保索引的大小不会超过767字节的限制。例如,使用VARCHAR(191)
而不是VARCHAR(255)
,因为191 * 4 = 764
字节在限制内。 - 指定索引的前缀长度:
对于VARCHAR
和TEXT
类型的字段,你可以指定一个前缀长度来创建索引,例如:
CREATE INDEX part_of_name ON table_name (column_name(191));
```
- 更改表的ROW_FORMAT:
如果你正在使用MySQL 5.7或更高版本,你可以将InnoDB表的行格式设置为DYNAMIC
或COMPRESSED
来支持更长的索引:
ALTER TABLE table_name ROW_FORMAT=DYNAMIC;
```
- 升级数据库:
如果你使用的是MySQL的旧版本,升级到MySQL 5.7或更高版本允许最大索引长度为3072字节。 - 更改字符集:
如果不需要使用utf8mb4字符集,可以改用utf8字符集,每个字符最多3个字节。 - 配置InnoDB大前缀:
如果不能升级MySQL版本,可以在my.cnf
或my.ini
配置文件中启用innodb_large_prefix
选项。这将允许最大索引长度为3072字节,但前提是表使用DYNAMIC
或COMPRESSED
行格式。
[mysqld]
innodb_large_prefix = 1
innodb_file_format = Barracuda
innodb_file_per_table = 1
```
在配置文件中做出这些更改后,重启MySQL服务使设置生效。
在你的情况下,你可能需要调整join_key
和family_name
字段的长度,或者选择上述解决方案中的一种来减少索引的大小。
文章评论