架構
create table course (course_id varchar(8), title varchar(50), dept_name varchar(20), credits numeric(2,0) check (credits > 0), primary key (course_id), foreign key (dept_name) references department (dept_name) on delete set null );
我想將此資料新增到表中,但無法新增 0 個積分。
“CS-001”,標題為“每週研討會”,0 學分
插入查詢
INSERT INTO `course`(`course_id`, `title`, `credits`) VALUES ('CS-001','Weekly Seminar','0');
查詢結果:
有沒有其他方法可以在不改變表結構的情況下插入相同的資料?
P粉5548420912024-04-02 09:49:12
foreign_key_checks
選項會影響外鍵強制執行,而不是檢查約束強制執行。
mysql> set foreign_key_checks=0; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO `course`(`course_id`, `title`, `credits`) VALUES ('CS-001','Weekly Seminar','0'); ERROR 3819 (HY000): Check constraint 'course_chk_1' is violated.
您必須使用ALTER TABLE
,但不必刪除約束。
mysql> alter table course alter check course_chk_1 not enforced; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> INSERT INTO `course`(`course_id`, `title`, `credits`) VALUES ('CS-001','Weekly Seminar','0'); Query OK, 1 row affected (0.00 sec)
但是一旦插入該行,就無法重新啟用檢查約束,因為啟用約束時將重新檢查行。
mysql> alter table course alter check course_chk_1 enforced; ERROR 3819 (HY000): Check constraint 'course_chk_1' is violated.
您可以隨後刪除或更新違反檢查約束的行,然後重新啟用約束。
如果您需要能夠向 credits
欄位插入零值,那麼 check (credits > 0)
似乎不是那個欄位。也許需要檢查(學分> = 0)
。