当我创建一个具有如下约束的类时:
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一起使用?
答案 0 :(得分:1)
根据MySQL documentation,CHECK
约束被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 NULL
,UNIQUE
和FOREIGN KEY
会被强制执行,但不会强制执行通用约束(例如应具有特定值的列)。