搜索

首页  >  问答  >  正文

绕过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 天前496

全部回复(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
  • 取消回复