【问题标题】:MySQL Error 1062: Duplicate entry for keyMySQL 错误 1062:键的重复条目
【发布时间】:2018-06-14 09:29:56
【问题描述】:

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

在我的 date 表中,我创建了具有 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 月,这导致了错误..

ERROR 1062 (23000) at line 121: Duplicate entry '6' for key 'idx_mois'

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

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

【问题讨论】:

  • 您可能不希望对mois 使用唯一约束,因为这意味着您只能在特定mois 上拥有单行数据,即使在不同的annee、@ 987654328@ 或jour。你想用那个独特的约束做什么? (对于其他读者:mois = 月,annee = 年,semaine = 周,jour = 日)
  • ForeignKey 参数需要 UNIQUE 约束 ForeignKey.to_field ..
  • 您能否将 FK 定义添加到您的问题中?它可能应该是具有唯一约束的 FK 目标表(例如,如果它描述月份名称,您不希望有一行说第 1 个月是 1 月,而另一行说第 1 个月是 2 月)
  • @Aaron 完成! :)
  • 根据经验:外键总是指主键。如果没有,您可能在数据库模型中做错了什么。 (这条规则有例外,但不要从他们开始)。例如。您在日期表中的主键显然只是dateid(您可以直接从dateid 计算其他4 个值,这也意味着annee/moins 不允许在astreinte_mensu 中使用)。您似乎想通过破坏模型然后修复由此产生的问题来解决不同的问题,而不是寻找更好的方法来实现您的管理表单字段。

标签: mysql sql database mariadb unique


【解决方案1】:

日期的组成部分没有列;而是使用各种datetime functionsSELECT 一侧拆分

使用日期算术函数优于数字和字符串函数。示例CURDATE() - INTERVAL 2 MONTH

UNIQUE KEY idx_mois (mois) 表示该表中的行数不会超过 12 行?或者您是否有超过 12 个月的时间?也许你不是说UNIQUE

【讨论】:

  • 不知何故,我试图有几年的日期,所以几次 12 个月,并且 UNIQUE 约束能够将 date.month 字段专门分配给 on-call.month 字段,以便在我的 Django 管理表单中显示正确的内容。
猜你喜欢
  • 2018-05-01
  • 2011-07-13
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多