【发布时间】: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