无法在 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 之前在客户端应用程序中强制执行它。然后你可以申请任何你想要的条件。
我创建了一个名为 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 之前在客户端应用程序中强制执行它。然后你可以申请任何你想要的条件。