搜尋

首頁  >  問答  >  主體

繞過SQL中的檢查約束的方法

架構

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粉642436282P粉642436282266 天前497

全部回覆(1)我來回復

  • P粉554842091

    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)

    回覆
    0
  • 取消回覆