首页 > 解决方案 > MYSQL 8.0.17 CHECK 即使已实现也无法正常工作

问题描述

根据CHECKMYSQL 的手册,约束从 8.0.16 开始已经完全实现。但是当我尝试使用它创建一个表时,失败时它没有显示任何错误CHECK。出了什么问题?这是我创建表的代码:

CREATE TABLE Employee (ENUM INT(4) AUTO_INCREMENT, 
FNAME varchar(10) NOT NULL, 
MNAME varchar(1) DEFAULT NULL, 
LNAME varchar(10) NOT NULL, 
BIRTHDATE date NOT NULL, 
GENDER char(1) CHECK(GENDER IN ('M', 'F')), 
SSN varchar(10) UNIQUE NOT NULL,
JOB_TITLE varchar(20) CHECK(JOB_TITLE IN ('Lecturer', 'Professor', 'Asst. Professor', 'Sr. Lecturer')),  
SALARY numeric(10, 2) NOT NULL, 
HIREDATE date NOT NULL, 
TAX numeric(8, 2) NOT NULL, 
DEPARTMENT varchar(20) CHECK(DEPARTMENT IN ('Biotechnology', 'Computer Science', 'Nano Technology', 'Information Technology')), 
PRIMARY KEY(ENUM));

在这里,JOB_TITLE检查是否在列表中并且与 相同DEPARTMENT。但是这个查询:

INSERT INTO Employee (FNAME, MNAME, LNAME, BIRTHDATE, GENDER, SSN, JOB_TITLE,  SALARY, HIREDATE, TAX, DEPARTMENT ) VALUES 
 ('Sangeet', 'R', 'Sharma', date '1965-11-08', 'M', '11MH456633', 'Prof', 1200900, date '1990-12-16', 120090, 'Computer');

被接受,没有任何错误。为什么会这样?

标签: mysqlconstraints

解决方案


尝试

INSERT INTO Employee (FNAME, 
                      MNAME, 
                      LNAME, 
                      BIRTHDATE, 
                      GENDER, 
                      SSN, 
                      JOB_TITLE,  
                      SALARY, 
                      HIREDATE, 
                      TAX, 
                      DEPARTMENT 
                      ) 
VALUES              ('Sangeet',
                     'R', 
                     'Sharma', 
                     date '1965-11-08',
                     'M', 
                     '11MH456633', 
                     'Professor',
                     1200900,
                     date '1990-12-16', 
                     120090, 
                     'Computer Science'
                     );

当您尝试使用“Prof.”时,您的查询版本中违反了employee_chk_2。而不是“教授”。并且违反了employee_chk_3,因为您试图插入“计算机”而不是“计算机科学”。检查约束在您建立它们时起作用。


推荐阅读