无法在 mysql 上 运行 NOCHECK CONSTRAINT - SQL 语法错误

Can't run NOCHECK CONSTRAINT on mysql - SQL syntax error

我创建了一个名为 Students 的 table。 它有 4 个字段:Name、Age、Class、Years.

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| Name  | varchar(50) | NO   | PRI | NULL    |       |
| Age   | smallint    | YES  |     | 18      |       |
| Class | varchar(10) | YES  |     | NULL    |       |
| Years | smallint    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

我在 Years 字段上添加了 CHECK CONSTRAINT,这意味着 Years 列中的值不能低于 3。 我做到了

mysql> alter table Students
    -> add constraint CK_Years check (Years >= 3);

我的目标是插入一个包含 Years 值为 2 的记录的查询,这意味着它不会通过 CK_Years 检查约束。

我想在不更改约束或插入语句中的字段的情况下执行此操作。 可能吗?

mysql> insert into Students
    -> (Name, Age, Class, Years) values ("Eric","25","110","2");

我试过:

mysql> alter table Students
    -> NOCHECK CONSTRAINT CK_Years;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOCHECK CONSTRAINT CK_Years' at line 2

我只想为此插入禁用它,然后再将其恢复(检查约束)。

如您所见,我遇到了这个错误。 我试着用几种方式来写它。机智'CK_Years'CK_Years

`CK_Years`

所有这些方式都出现相同的错误。

我已验证我在 table:

中有约束
mysql> select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    -> where table_name='Students';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE | ENFORCED |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| def                | School          | PRIMARY         | School     | Students   | PRIMARY KEY     | YES      |
| def                | School          | CK_Years        | School     | Students   | CHECK           | YES      |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+

那么如何在不更改约束或插入语句中的字段的情况下做到这一点呢? 如何修复语法错误? 又是什么原因呢?

谢谢。

MySQL 确实支持更改检查约束的语法,因此不会强制执行,但它不同于 Microsoft SQL 服务器语法。

mysql> alter table students alter check CK_Years NOT ENFORCED;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into students values ('Eric',25,'110',2);
Query OK, 1 row affected (0.00 sec)

记录在此处:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

如果您重新启用它,约束将被强制执行,如果您插入了任何违反约束的行,您将在尝试重新启用它时收到错误消息。

mysql> alter table students alter check CK_Years ENFORCED;
ERROR 3819 (HY000): Check constraint 'CK_Years' is violated.

此外,一旦您不强制执行约束,它将对所有客户端生效,而不仅仅是对一个 INSERT。

所以我不认为你可以用 CHECK 约束做你想做的事。您可能必须编写一个触发器,在该列上强制执行类似的条件,但具有有条件地执行它的逻辑。

或者做大多数开发人员在 MySQL 支持 CHECK 约束之前所做的事情:在执行 INSERT 之前在客户端应用程序中强制执行它。然后你可以申请任何你想要的条件。