【发布时间】:2021-10-31 19:09:09
【问题描述】:
我创建了一个名为Students 的表。
它有 4 个字段:姓名、年龄、班级、年份。
+-------+-------------+------+-----+---------+-------+
| 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 字段上添加了一个检查约束,这意味着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`
所有这些方法都出现相同的错误。
我已验证我在表中有约束:
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 |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
那么如何在不更改约束或插入语句中的字段的情况下做到这一点? 如何修复语法错误? 又是什么原因呢?
谢谢。
【问题讨论】:
-
你不能禁用它,那为什么你想给它加 2 的时候有一个 >=3 约束呢?
-
@nbk 进行练习。我正在研究 SQL rn,我想看看是否可以绕过约束并临时禁用约束。
-
你只能禁用外键和键检查而已
-
MySQL 不支持 NOCHECK。它在 MS SQL Server 上的 T-SQL 中可用。
-
@nbk 是的,在这里我想禁用密钥检查,对吗?
CK_Years是关键检查,或者至少我认为是这样。 (如果我错了,请纠正我)
标签: mysql sql database constraints sql-insert