← 返回错误码列表
MySQL错误码 1364 分析与解决方案
错误信息
Error 1364
字段没有默认值。
这个错误通常发生在以下情况:
插入数据时没有为NOT NULL字段提供值
字段没有设置默认值
使用了严格的SQL模式
INSERT INTO
users (username, email)
VALUES
(
'john_doe'
,
'john@example.com'
);
-- 错误: Field 'created_at' doesn't have a default value
解决方案
为INSERT语句提供所有NOT NULL字段的值
为字段设置默认值(DEFAULT约束)
修改字段允许NULL值
检查表结构并确保所有必需字段都有值
使用INSERT IGNORE或ON DUPLICATE KEY UPDATE
调整SQL模式设置
PHP解决方案示例
// 方法1: 提供所有必需字段的值
$stmt
=
$pdo
->prepare(
"INSERT INTO users (username, email, created_at) VALUES (?, ?, NOW())"
);
$stmt
->execute([
$username
,
$email
]);
// 方法2: 使用默认值
$stmt
=
$pdo
->prepare(
"INSERT INTO users (username, email) VALUES (?, ?)"
);
$stmt
->execute([
$username
,
$email
]);
// 前提: created_at字段有DEFAULT CURRENT_TIMESTAMP
// 方法3: 使用INSERT IGNORE
$stmt
=
$pdo
->prepare(
"INSERT IGNORE INTO users (username, email) VALUES (?, ?)"
);
$stmt
->execute([
$username
,
$email
]);
// 注意: IGNORE会忽略错误但可能不是最佳实践
表结构分析
假设有以下表结构:
字段名
类型
允许NULL
默认值
id
INT AUTO_INCREMENT
NO
NULL
username
VARCHAR(50)
NO
NULL
email
VARCHAR(100)
NO
NULL
created_at
TIMESTAMP
NO
NULL
问题分析:
created_at
字段是NOT NULL但没有默认值
插入数据时必须显式提供该字段的值
否则会触发错误1364
修复方案
1. 修改表结构(推荐)
-- 添加默认值
ALTER TABLE
users
MODIFY COLUMN
created_at TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP
NOT NULL
;
-- 或者允许NULL值
ALTER TABLE
users
MODIFY COLUMN
created_at TIMESTAMP
NULL
;
2. 调整SQL模式
-- 查看当前SQL模式
SELECT
@@sql_mode;
-- 移除STRICT_TRANS_TABLES模式(不推荐)
SET
sql_mode =
''
;
3. 使用合适的INSERT语句
-- 提供所有必需字段
INSERT INTO
users (username, email, created_at)
VALUES
(
'john_doe'
,
'john@example.com'
,
NOW
());
调试工具
使用以下MySQL命令分析表结构:
# 查看表结构
DESCRIBE
table_name;
# 查看详细的表信息
SHOW
CREATE TABLE table_name;
# 查看SQL模式
SELECT
@@sql_mode;
# 查找所有没有默认值的NOT NULL字段
SELECT
TABLE_NAME, COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA =
'your_database'
AND
IS_NULLABLE =
'NO'
AND
COLUMN_DEFAULT
IS NULL
AND
EXTRA
NOT LIKE
'%auto_increment%'
;