← 返回错误码列表

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%';