一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - django model去掉unique_together報錯的解決方案

django model去掉unique_together報錯的解決方案

2020-09-10 13:25腳本之家 Python

本文給大家分享的是在使用django model去掉unique_together時報錯的解決思路和具體步驟,提供給大家參考下,希望對大家學習使用django能夠有所幫助

事情是這樣的,我有一個存儲考試的表

?
1
2
3
4
5
6
7
8
9
class Exam(models.Model):
 category = cached_fields.ForeignKeyField(Category)
 name = models.CharField(max_length=128)
 date = models.DateField()
 created_at = models.DateTimeField(auto_now_add=True)
 updated_at = models.DateTimeField(auto_now=True)
 
 class Meta:
 unique_together = ('category', 'date')

category 表示考試的類型, date 表示考試的日期。建表的時候考慮到一個類型的考試在同一個應該只有一個考試,所以就加了一個 unique_together 。但是由于業(yè)務需要,這個 unique_together 不需要了。

用過 django 的人都知道,這不是個大問題,刪掉 unique_together 的代碼,然后 makemigrations 唄,確實,我就這么做了。但是當我 migrate 的時候卻報錯了,錯誤如下:

 

復制代碼 代碼如下:
django.db.utils.OperationalError: (1553, "Cannot drop index 'insurance_exam_category_id_a430e581_uniq': needed in a foreign key constraint")

 

 

數(shù)據(jù)庫不讓我刪除這個 index ,并且告訴我有一個 外鍵約束 用到了這個它。我就奇怪了,category是外鍵沒錯,但是我這個是 unique_together 啊,怎么可能有哪個外鍵用到了它呢?

沒辦法,我只能到數(shù)據(jù)庫里尋找答案, show create table exam ,輸出如下:

?
1
2
3
4
5
6
7
8
9
10
11
| insurance_exam | CREATE TABLE `insurance_exam` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `date` date NOT NULL,
 `created_at` datetime(6) NOT NULL,
 `updated_at` datetime(6) NOT NULL,
 `category_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `insurance_exam_category_id_a430e581_uniq` (`category_id`,`date`),
 CONSTRAINT `insurance_exam_category_id_a2238260_fk_insurance_category_id` FOREIGN KEY (`category_id`) REFERENCES `insurance_category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1062 DEFAULT CHARSET=utf8mb4 |

可以看到 UNIQUE KEY 那一行就是 unique_together ,下面一行是 category 外鍵。沒有其他東西了啊,到底哪個外鍵用到了我們的 unique_together

外鍵只能是 category 了,也沒有別的外鍵啊。到底是怎么回事呢?

原因是這樣的: 在Mysql中外鍵會自動在表上添加一個index ,也就說如果沒有unique_together,我們的表應該是這樣的:

?
1
2
3
4
5
6
7
8
9
10
11
| insurance_exam | CREATE TABLE `insurance_exam` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `date` date NOT NULL,
 `created_at` datetime(6) NOT NULL,
 `updated_at` datetime(6) NOT NULL,
 `category_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `insurance_exam_category_id_a2238260_fk_insurance_category_id` FOREIGN KEY (`category_id`) REFERENCES `insurance_category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1062 DEFAULT CHARSET=utf8mb4 |

但是因為有了 unique_together unique_key ,并且 category 在聯(lián)合索引的左邊,根據(jù) 最左前綴 原則, category 的索引就有了,所以就不會另外建索引,這個時候 category 的外鍵約束就依賴了這個 unique_key ,所以刪除的時候會出現(xiàn)那樣的報錯。

機智的小伙伴應該想到了,如果我們要去掉 unique_together ,我們可以將 category KEY 加回去,這樣就可以將 unique_together 刪掉了。 sql 如下:

?
1
alter table exam add index(category_id);

這樣,migrate就能成功了。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女张开腿让我了一夜 | 亚洲 欧美 日本 国产 高清 | 五月色天在线视频综合观看 | 操碰免费视频 | 欧美一卡2卡3卡四卡海外精品 | 热穴高校 | 午夜精品久久久久久久99蜜桃 | 51国产午夜精品免费视频 | 免费超级乱淫播放手机版 | 好男人好资源在线观看免费 | 日本又大又硬又粗的视频 | 千金肉奴隶在线观看 | 日日操视频| 日本一区二区不卡久久入口 | 亚洲H成年动漫在线观看不卡 | 狠狠色狠狠色综合婷婷tag | 美女视频一区二区三区在线 | 国产亚洲视频网站 | 千金肉奴隶免费观看 | 十大免费b2b网站 | 亚洲精品www久久久久久久软件 | 香蕉精品国产高清自在自线 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | juliaann厨房大战| 大乳一级一区二区三区 | 青草视频在线观看免费视频 | 91肥熟国产老肥熟在线 | 草逼视频网站 | 我的妹妹最近有点怪在线观看 | 艹的好爽| 亚洲天堂网在线观看视频 | 媳妇和公公小说 | 欧美四级无删版影片 | 欧美三级免费观看 | 日本三级香港三级久久99 | jizz农村野外jizz农民 | 日韩一区二区在线视频 | 艹出白浆| 男女真实无遮挡xx00动态图软件 | 黑人粗又长 | 男人好大好硬好爽免费视频 |