Maison  >  Questions et réponses  >  le corps du texte

Comment contourner les contraintes de vérification dans SQL

Architecture

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
        );

Je souhaite ajouter ces données au tableau mais je ne peux pas ajouter 0 point.

"CS-001", intitulé "Séminaire hebdomadaire", 0 crédit

Insérer une requête

INSERT INTO `course`(`course_id`, `title`, `credits`) VALUES ('CS-001','Weekly Seminar','0');

Résultats de la requête :

Existe-t-il un autre moyen d'insérer les mêmes données sans modifier la structure du tableau ?

P粉642436282P粉642436282185 Il y a quelques jours416

répondre à tous(1)je répondrai

  • P粉554842091

    P粉5548420912024-04-02 09:49:12

    L'option

    foreign_key_checks affecte l'application des clés étrangères, et non l'application des contraintes.

    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.

    Vous devez utiliser ALTER TABLE, mais vous n'êtes pas obligé de supprimer la contrainte.

    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)

    Mais une fois la ligne insérée, il n'y a aucun moyen de réactiver la contrainte de vérification car la ligne sera revérifiée lorsque la contrainte sera activée.

    mysql> alter table course alter check course_chk_1 enforced;
    ERROR 3819 (HY000): Check constraint 'course_chk_1' is violated.

    Vous pouvez ensuite supprimer ou mettre à jour la ligne qui viole la contrainte de vérification et réactiver la contrainte.

    Si vous avez besoin de pouvoir demander credits 列插入零值,那么 check (credits > 0) 似乎不是正确的选择那个专栏。也许需要检查(学分> = 0).

    répondre
    0
  • Annulerrépondre