【问题标题】:how to define check constraint in oracleoracle中如何定义检查约束
【发布时间】:2017-01-23 18:11:13
【问题描述】:

在下面的代码中如何定义可以防止值 10,20,30 插入的检查约束

create table testtable(
  testtableid integer primary key, 
  testtableno integer unique,
  testtablename varchar2(255),
  testtablevalue number check(testtablevalue <>10 
                            or testtablevalue <>20
                            or  testtablevalue<>30),
  testtable date DEFAULT sysdate, 
  empid number FOREIGN key  references empmaster(empid)
)

【问题讨论】:

    标签: oracle constraints


    【解决方案1】:

    “阻止值 10,20,30”

    您想阻止所有这些值,因此您需要使用布尔 AND。

    testtablevalue number check(testtablevalue <> 10 
                                AND testtablevalue <> 20 
                                AND  testtablevalue<>30),
    

    对于更长的禁止值列表,使用 NOT IN 需要更少的输入:

    【讨论】:

      【解决方案2】:

      INTEGER 是 Oracle 支持的 ANSI 数据类型之一,并注意到它的等价物是 NUMBER(p,0)。使用 INTEGER 具有语义价值,因为审阅者会知道它不仅是一组精度的数字,而且必须是整数。

      (查看此答案以更好地了解 Oracle 中 INTEGER 和 NUMBER 之间的区别:https://stackoverflow.com/a/23916374/2611451

      您需要CONSTRAINT 关键字,并且可以使用NOT IN 来定义检查约束:

      create table testtable(
         testtableid Number primary key, 
         testtableno Number unique,
         testtablename varchar2(255),
         testtablevalue Number,
         ...
         CONSTRAINT tblValue_chk check(testtablevalue NOT IN (10, 20, 30))
         ....
      )
      

      编辑

      检查也可以内联应用:

      create table testtable(
          testtableid Number primary key, 
          testtableno Number unique,
          testtablename varchar2(255),
          testtablevalue Number check(testtablevalue NOT IN (10, 20, 30))
      )
      

      【讨论】:

      • 表级约束需要constraint关键字;内联定义检查约束是完全有效的。
      • Oracle 12c Data Types Documentation 包括 INTEGER 作为 Oracle 支持的 ANSI 数据类型之一,并指出它的等价物是 NUMBER(p,0),但零引用它被弃用。你的陈述有参考吗?使用INTEGER 具有语义价值,因为审阅者会知道它不仅仅是一个设定精度的数字,而且它必须是一个整数。
      • 我敢打赌这只是这个问题中使用的一些伪造信息:stackoverflow.com/questions/13494010/…。我认为它也没有被弃用,我编辑了答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-07
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多