创建含检查约束的Oracle表插入数据时触发ORA-02290错误求助
ORA-02290: 检查约束违反的排查与解决
错误根源
ORA-02290错误说明插入的数据违反了表的某个检查约束。对比建表语句和插入数据,问题出在PhoneNumber字段的约束定义上:
原约束代码:
PhoneNumber CHAR(10) CHECK (PhoneNumber LIKE '[0-9]%'), -- Must be 10 digits
Oracle的LIKE运算符不支持正则表达式的方括号语法,LIKE '[0-9]%'实际是要求字符串以[0-9]这五个字符开头,而不是以数字开头。你插入的'1234567890'显然不符合这个要求,因此触发约束违反。另外,原约束也没确保整个字段都是10位数字,逻辑本身存在漏洞。
修复方案
方案1:修改已创建的表
先确认约束名(可选,用来验证SYS_C008305确实对应PhoneNumber的约束):
SELECT constraint_name, search_condition FROM user_constraints WHERE table_name = 'ORACLE_ALL_DATATYPES' AND constraint_type = 'C';
删除旧约束并添加正确的正则校验约束:
ALTER TABLE Oracle_All_DataTypes DROP CONSTRAINT SYS_C008305; ALTER TABLE Oracle_All_DataTypes ADD CONSTRAINT chk_phonenumber_valid CHECK (REGEXP_LIKE(PhoneNumber, '^[0-9]{10}$'));
方案2:重新建表时修正约束
直接在建表语句中替换PhoneNumber的约束逻辑,用REGEXP_LIKE确保字段是10位纯数字:
CREATE TABLE Oracle_All_DataTypes ( ID NUMBER(10) PRIMARY KEY, FirstName VARCHAR2(50) NOT NULL, LastName VARCHAR2(50), Age NUMBER(3) CHECK (Age BETWEEN 0 AND 120), Email VARCHAR2(100) UNIQUE, PhoneNumber CHAR(10) CHECK (REGEXP_LIKE(PhoneNumber, '^[0-9]{10}$')), -- 验证10位纯数字 Salary NUMBER(10, 2) CHECK (Salary > 0), JoiningDate DATE NOT NULL, IsActive CHAR(1) DEFAULT 'Y' CHECK (IsActive IN ('Y', 'N')), DepartmentID NUMBER(5), Address VARCHAR2(255), City VARCHAR2(50), State VARCHAR2(50), Country VARCHAR2(50) DEFAULT 'USA', PostalCode VARCHAR2(10) CHECK (LENGTH(PostalCode) BETWEEN 5 AND 10), ManagerID NUMBER(10), CreatedDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ModifiedDate TIMESTAMP, Gender CHAR(1) CHECK (Gender IN ('M', 'F', 'O')), Notes CLOB );
完成约束修正后,重新执行你的插入语句即可正常插入数据。
内容的提问来源于stack exchange,提问作者Mohammad Saqlain
相关产品推荐
相关产品推荐

