如何仅允许VARCHAR2列中的字母(Oracle SQL)
我在Oracle SQL数据库中有一列“姓氏” 创建表测试( id VARCHAR2(3)主键, 姓VARCHAR2(10))如何仅允许VARCHAR2列中的字母(Oracle SQL),sql,regex,oracle,constraints,Sql,Regex,Oracle,Constraints,我在Oracle SQL数据库中有一列“姓氏” 创建表测试( id VARCHAR2(3)主键, 姓VARCHAR2(10)) 我应该在上面的查询中添加什么,以允许在“姓氏”中只插入字母字符?您的表中需要有一个检查约束 以下内容应足以检查(regexp_like(姓氏,'^[:alpha:]+$)。其中[[:alpha:][]是字母字符类。因此,只考虑字母表 让我们看一个测试用例- SQL> CREATE TABLE TEST( 2 surname VARCHAR2(10), 3
我应该在上面的查询中添加什么,以允许在“姓氏”中只插入字母字符?您的表中需要有一个
检查约束
以下内容应足以检查(regexp_like(姓氏,'^[:alpha:]+$)
。其中[[:alpha:][]
是字母字符类。因此,只考虑字母表
让我们看一个测试用例-
SQL> CREATE TABLE TEST(
2 surname VARCHAR2(10),
3 CONSTRAINT constraint_name CHECK (regexp_like(surname,'^[[:alpha:]]+$'))
4 )
5 /
Table created.
SQL>
SQL> INSERT INTO TEST values ('LALIT')
2 /
1 row created.
SQL>
SQL> INSERT INTO TEST values ('123')
2 /
INSERT INTO TEST values ('123')
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.CONSTRAINT_NAME) violated
SQL>
到目前为止效果不错。让我们检查字母数字值
SQL> INSERT INTO TEST VALUES ('LALIT123')
2 /
INSERT INTO TEST VALUES ('LALIT123')
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.CONSTRAINT_NAME) violated
SQL>
SQL> SELECT * FROM TEST
2 /
SURNAME
----------
LALIT
SQL>
因此,CHECK
constraint只允许字母表
我试过:CHECK(姓氏像“%[^a-zA-Z]”);但当我有一个错误“ORA-02290:check constraint(DBNAME.SYS_C00157564)违犯”时,即使我插入'Smith'作为姓氏:/Ok,没有问题。检查我的答案。我可以稍后在创建此表时再次使用此约束吗?只需写入约束\u名称?您的意思是要在创建表后添加检查约束?是的,您可以使用ALTER
语句来实现altertable TABLE\u name ADD CONSTRAINT\u name CHECK(column\u name condition)
我的意思是,如果我在行namesvarchar2(10)CONSTRAINT\u name CHECK(regexp_like(姓氏),^[:alpha:][]+$”)之后添加约束(column\u name CHECK)
一行namesvarchar2(10)CONSTRAINT\u name
,它会与相同的“CHECK”一起工作吗没有键入它吗?不,它不会以这种方式工作。你必须明确地为它们中的每一个写约束条件。你可能要考虑的是姓氏至少在它们中可以有撇号(′)和破折号(-)。在这种情况下,你可能想要使用稍微不同的正则表达式,例如,<代码> ^ [-ZA-Z’-] + $< /代码>。(双单引号的原因是为了在甲骨文字符串中转义)。还要注意带有重音符号的外国姓氏等等!