我創建了一個名為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欄位上添加了一個 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`
所有這些方式都得到了同樣的錯誤。
我已經驗證我在表中有約束:
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 |
-------------------- ------------------- ----------------- -------------- ------------ ----------------- ----------
那么如何在不更改插入陳述句中的約束或欄位的情況下執行此操作呢?如何修復語法錯誤?原因是什么?
謝謝。
uj5u.com熱心網友回復:
MySQL 確實支持更改檢查約束的語法,因此它不會被強制執行,但它與 Microsoft SQL Server 語法不同。
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 之前在客戶端應用程式中強制執行它。然后你可以應用任何你想要的條件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/343761.html
