Django/MySQL:使非唯一字段唯一失败,即使字段值是唯一的
Django/MySQL: Making non-unique field unique fails even if field values are unique
我目前有这个:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField()
我需要使字段 committee_xml_id
独一无二,即:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField(unique=True)
我也试过这样做:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField(unique=True, db_index=False)
唉,结果还是一样
有 运行 ./manage.py makemigrations
和随后的 ./manage.py migrate
,问题是这样的:
django.db.utils.OperationalError: (1061, "Duplicate key name 'appname_committee_committee_xml_id_d1210032_uniq'")
乍一看,问题似乎是 table 中已经有非唯一数据,但问题恰恰是没有。 table 中只有 45 行,字段 committee_xml_id
仅包含唯一条目。
以下查询没有给出结果,正如预期的那样,没有重复项:
SELECT
com.committee_xml_id,
COUNT(*)
FROM
appname_committee AS com
GROUP BY
com.committee_xml_id
HAVING
COUNT(*) != 1
为了严格起见,这里是没有 HAVING
条件的相同查询,清楚地表明确实没有重复项:
SELECT
com.committee_xml_id,
COUNT(*)
FROM
appname_committee AS com
GROUP BY
com.committee_xml_id
结果是:
# committee_xml_id, COUNT(*)
78, 1
79, 1
124, 1
125, 1
129, 1
130, 1
131, 1
132, 1
133, 1
134, 1
137, 1
139, 1
140, 1
141, 1
142, 1
147, 1
148, 1
149, 1
150, 1
151, 1
152, 1
153, 1
154, 1
160, 1
166, 1
167, 1
168, 1
169, 1
170, 1
176, 1
192, 1
193, 1
194, 1
195, 1
198, 1
199, 1
200, 1
201, 1
202, 1
203, 1
204, 1
205, 1
206, 1
207, 1
216, 1
非常感谢任何帮助。
错误与 table 中的 数据 无关。如果我们试图插入违反唯一约束的数据,或者如果我们试图在 table 中存在重复项时定义 UNIQUE 键,我们将看到不同的错误:
Error Code 1062: Duplicate entry ...
当我们试图定义一个新的密钥时出现 1061
错误,而该密钥已经存在。
作为演示:
create table foo2 (id int);
0 row(s) affected
insert into foo2 (id) values (1),(1);
2 row(s) affected
alter table foo2 add unique key foo2_ux1 (id);
Error Code: 1062 Duplicate entry '1' for key 'foo2_ux1'
alter table foo2 add key foo2_ix2 (id);
0 row(s) affected
alter table foo2 add key foo2_ix2 (id);
Error Code: 1061 Duplicate key name 'foo2_ix2'
alter table foo2 add UNIQUE key foo2_ix2 (id);
Error Code: 1061 Duplicate key name 'foo2_ix2'
A SHOW CREATE TABLE
将向我们展示该名称的密钥实际上已经存在
CREATE TABLE `foo2` (
`id` INT(11) DEFAULT NULL,
KEY `foo2_ix2` (`id`)
) ENGINE=InnoDB
我目前有这个:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField()
我需要使字段 committee_xml_id
独一无二,即:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField(unique=True)
我也试过这样做:
class Committee(models.Model):
# ...some fields...
committee_xml_id = models.IntegerField(unique=True, db_index=False)
唉,结果还是一样
有 运行 ./manage.py makemigrations
和随后的 ./manage.py migrate
,问题是这样的:
django.db.utils.OperationalError: (1061, "Duplicate key name 'appname_committee_committee_xml_id_d1210032_uniq'")
乍一看,问题似乎是 table 中已经有非唯一数据,但问题恰恰是没有。 table 中只有 45 行,字段 committee_xml_id
仅包含唯一条目。
以下查询没有给出结果,正如预期的那样,没有重复项:
SELECT
com.committee_xml_id,
COUNT(*)
FROM
appname_committee AS com
GROUP BY
com.committee_xml_id
HAVING
COUNT(*) != 1
为了严格起见,这里是没有 HAVING
条件的相同查询,清楚地表明确实没有重复项:
SELECT
com.committee_xml_id,
COUNT(*)
FROM
appname_committee AS com
GROUP BY
com.committee_xml_id
结果是:
# committee_xml_id, COUNT(*)
78, 1
79, 1
124, 1
125, 1
129, 1
130, 1
131, 1
132, 1
133, 1
134, 1
137, 1
139, 1
140, 1
141, 1
142, 1
147, 1
148, 1
149, 1
150, 1
151, 1
152, 1
153, 1
154, 1
160, 1
166, 1
167, 1
168, 1
169, 1
170, 1
176, 1
192, 1
193, 1
194, 1
195, 1
198, 1
199, 1
200, 1
201, 1
202, 1
203, 1
204, 1
205, 1
206, 1
207, 1
216, 1
非常感谢任何帮助。
错误与 table 中的 数据 无关。如果我们试图插入违反唯一约束的数据,或者如果我们试图在 table 中存在重复项时定义 UNIQUE 键,我们将看到不同的错误:
Error Code 1062: Duplicate entry ...
当我们试图定义一个新的密钥时出现 1061
错误,而该密钥已经存在。
作为演示:
create table foo2 (id int);
0 row(s) affected
insert into foo2 (id) values (1),(1);
2 row(s) affected
alter table foo2 add unique key foo2_ux1 (id);
Error Code: 1062 Duplicate entry '1' for key 'foo2_ux1'
alter table foo2 add key foo2_ix2 (id);
0 row(s) affected
alter table foo2 add key foo2_ix2 (id);
Error Code: 1061 Duplicate key name 'foo2_ix2'
alter table foo2 add UNIQUE key foo2_ix2 (id);
Error Code: 1061 Duplicate key name 'foo2_ix2'
A SHOW CREATE TABLE
将向我们展示该名称的密钥实际上已经存在
CREATE TABLE `foo2` (
`id` INT(11) DEFAULT NULL,
KEY `foo2_ix2` (`id`)
) ENGINE=InnoDB