为什么Django CheckConstraint无法在MySQL上运行

时间:2019-08-23 18:31:02

标签: django

当我创建一个具有如下约束的类时:

constraints = [
    models.CheckConstraint(
            check=models.Q('plan' == 1),
            name="custom_constraint"
        )
]

我收到消息:

(models.W027) MySQL does not support check constraints.
        HINT: A constraint won't be created. Silence this warning if you don't care about it.

为什么Django CheckConstraints与PostgreSQL一起使用而不与MySQL一起使用?

1 个答案:

答案 0 :(得分:1)

根据MySQL documentationCHECK约束被MySQL数据库忽略:

  

MySQL 8.0.16之前的版本CREATE TABLE仅允许表 CHECK 约束语法的以下受限版本,该语法已解析   并被忽略**:

CHECK (expr)
     

自MySQL 8.0.16 起,CREATE TABLE允许表和列CHECK约束的核心功能,适用于所有存储引擎。   CREATE TABLE允许以下CHECK约束语法,   表约束和列约束:

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

因此,在8.0.16之前,确实已解析了CHECK约束,但是数据库引擎忽略了它,因此数据可能违反了约束。

但是,某些特定的约束(例如NOT NULLUNIQUEFOREIGN KEY会被强制执行,但不会强制执行通用约束(例如应具有特定值的列)。