首页 > 解决方案 > MySQL 错误 1062:键的重复条目

问题描述

我制作了一个 SQL 脚本来创建和填充一些我将与 Django 框架一起使用的表。

在我的日期表中,我使用 UNIQUE 约束创建mois列,如下所述:

    CREATE TABLE date (
        dateID int NOT NULL,
        annee int NOT NULL,
        mois int NOT NULL,
        .
        .
        CONSTRAINT PK_date PRIMARY KEY (dateID, annee, mois, semaine, jour),
        UNIQUE KEY idx_mois (mois),
    ) Engine=innoDB;

这是 FK 的定义:

CREATE TABLE astreinte_mensu (
dateID int NOT NULL PRIMARY KEY,
annee int,
mois int,
Personne1Nuit int,
Personne2Nuit int,
Personne1Jour int,
Personne2Jour int,
FOREIGN KEY (annee) REFERENCES date(annee),
FOREIGN KEY (mois) REFERENCES date(mois),
FOREIGN KEY (Personne1Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne1Jour) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Jour) REFERENCES contact(PersonID)

) 引擎=innoDB;

稍后在脚本中我有我的程序fill_date

CREATE PROCEDURE fill_date()
BEGIN
DECLARE currentdate DATE;
DECLARE stopdate DATE;
SET currentdate = CURDATE();
SET stopdate = ADDDATE(currentdate, INTERVAL 1 YEAR);
WHILE currentdate < stopdate DO
INSERT INTO date VALUES (
YEAR(currentdate)*10000+MONTH(currentdate)*100 + DAY(currentdate),
YEAR(currentdate),
MONTH(currentdate),
WEEKOFYEAR(currentdate),
DAY(currentdate));

SET currentdate = ADDDATE(currentdate,INTERVAL 1 DAY);
END WHILE;
END

当我启动文件时,出现与重复条目相关的错误。

所以我的桌子从 2018 年 6 月到 2019 年 6 月,这导致了错误..

第 121 行的错误 1062 (23000):键 'idx_mois' 的重复条目 '6'

有人可以点燃我的蜡烛吗?

编辑: Django 中的ForeignKey.to_field 参数需要 UNIQUE 约束,因为我想将 Astreinte_mensu.Mois 字段链接Date.mois字段。这样我希望它显示月份而不是完整日期,如django 管理页面的截图所示

标签: mysqlsqldatabasemariadbunique

解决方案


没有日期组件的列;SELECT而是使用各种日期时间函数在一边拆分

优先使用日期算术函数,而不是数字和字符串函数。例子CURDATE() - INTERVAL 2 MONTH

UNIQUE KEY idx_mois (mois)意味着您在该表中不会有超过 12 行?或者您是否有超过 12 个月的时间?也许你不是这个意思UNIQUE


推荐阅读