You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL导入SQL遇#1063错误:Date列规格错误的原因及解决

解决MySQL #1063错误:Date列的自增与约束问题

嘿,我来帮你拆解这个问题——你遇到的#1063错误本质是对MySQL数据类型和约束规则的误解,咱们一步步理清楚:

错误核心原因

咱们先揪出触发#1063的直接原因,顺便看看其他隐藏的问题:

  • DATE类型不能用AUTO_INCREMENT:MySQL的自增特性(AUTO_INCREMENT)仅支持整数类型(如INT、BIGINT、SMALLINT),日期类型根本不支持自动生成递增的日期值,这就是报错的根源。
  • 外键语法写错了:你直接在列定义前加FOREIGN KEY是错误的,正确姿势是先定义列,再单独声明外键约束。
  • 主键设计不合理:用Date作为Direct_hours和Indirect_hours的主键完全行不通——一个员工同一天可能有好几条工时记录,主键必须保证每条记录唯一,所以得换个思路。

修正方案(附完整修正后的SQL)

首先明确:你要存储YYYY/MM/DD格式的日期,MySQL的DATE类型本身就是按YYYY-MM-DD存储的,查询时用函数转成YYYY/MM/DD就行,不用修改列的存储类型。咱们逐个表修正:

1. 修正Direct_hours表

原来的写法错在给Date加了自增,还乱加外键前缀,修正后:

CREATE TABLE Direct_hours (
  Hour_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 新增自增主键,唯一标识每条记录
  Date DATE NOT NULL, -- 只保留DATE类型,去掉AUTO_INCREMENT
  Employee_number INT NOT NULL,
  Project_number INT NOT NULL,
  -- 单独声明外键约束
  FOREIGN KEY (Employee_number) REFERENCES Employee(Employee_number),
  FOREIGN KEY (Project_number) REFERENCES Project(Project_number)
);

2. 修正Indirect_hours表

和上面同理,去掉Date的自增,新增自增主键,修正外键:

CREATE TABLE Indirect_hours (
  Hour_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  Date DATE NOT NULL,
  Employee_number INT NOT NULL,
  Type VARCHAR(255) NOT NULL,
  Number INT NOT NULL,
  FOREIGN KEY (Employee_number) REFERENCES Employee(Employee_number)
);

3. 修正其他表的外键错误

你的Skilllevel和Project表也犯了同样的外键语法错误,修正后的写法如下:

Skilllevel表

CREATE TABLE Skilllevel (
  Levels TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  Employee_number INT NOT NULL, -- 先定义列
  Description VARCHAR(255) NOT NULL,
  Hourly_rate TINYINT NOT NULL,
  FOREIGN KEY (Employee_number) REFERENCES Employee(Employee_number) -- 再声明外键
);

Project表

CREATE TABLE Project (
  Project_number INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  Employee_number INT NOT NULL,
  Customer_number INT NOT NULL,
  Hourly_rate TINYINT NOT NULL,
  FOREIGN KEY (Employee_number) REFERENCES Employee(Employee_number),
  FOREIGN KEY (Customer_number) REFERENCES Customer(Customer_number)
);

关于日期格式的小技巧

如果想把查询结果里的日期显示成YYYY/MM/DD,不用修改存储格式,用DATE_FORMAT函数转换即可:

SELECT DATE_FORMAT(Date, '%Y/%m/%d') AS formatted_date FROM Direct_hours;

内容的提问来源于stack exchange,提问作者Je Boy Abi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:33