繁体   English   中英

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)

las,结果是一样的。

有运行./manage.py makemigrations随后, ./manage.py migrate ,问题是这样的:

django.db.utils.OperationalError: (1061, "Duplicate key name 'appname_committee_committee_xml_id_d1210032_uniq'")

乍看起来,问题似乎在于表中已经存在非唯一数据,但是问题恰恰在于没有。 该表中只有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

任何帮助,不胜感激。

错误与表中的数据无关。 如果我们试图插入违反唯一约束的数据,或者当表中有重复项时尝试定义UNIQUE键,我们将看到一个不同的错误:

错误代码1062:重复的条目...


当我们尝试定义一个新密钥并且该密钥已经存在时,会发生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);

错误代码:1062键“ foo2_ux1”的重复项“ 1”

  alter table foo2 add key foo2_ix2 (id);

  0 row(s) affected

  alter table foo2 add key foo2_ix2 (id);

<BR> 1061重复的键名'foo2_ix2'

  alter table foo2 add UNIQUE key foo2_ix2 (id);

<BR> 1061重复的键名'foo2_ix2'

SHOW CREATE TABLE将向我们显示该名称的键实际上已经存在

  CREATE TABLE `foo2` (
  `id` INT(11) DEFAULT NULL,
  KEY `foo2_ix2` (`id`)
  ) ENGINE=InnoDB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM