精华内容
下载资源
问答
  •  检查约束是一个规则,它确认一个SQL Server表某条记录的数据接受的字段值。检查约束帮助执行域完整性。域完整性定义了一个数据库表字段的有效值。检查约束可以验证一个单独字段或一些字段的域完整性。你对...

     什么是检查约束?

      检查约束是一个规则,它确认一个SQL Server表中某条记录中的数据可接受的字段值。检查约束帮助执行域完整性。域完整性定义了一个数据库表中字段的有效值。检查约束可以验证一个单独字段或一些字段的域完整性。你对一个单独的字段可以有多个检查完整性。如果被插入或更新的数据违反了一个检查约束,那么数据库引擎将不允许这个插入或更新的操作发生。

      检查约束包括一个逻辑表达式,用以确认什么是有效的表达式。逻辑表达式可能是一个单独的表达式比如“Salary < 200000.00”,或多个表达式,比如“RentalDate > GETDATE() and RentalDate < DATEADD(YY,1,GETDATE())”。如果一个逻辑表达式的一个检查约束返回了FALSE值,那么这个检查约束将限制这个表中数据插入或更新。对于逻辑表达式返回的是FALSE以外的值的所有记录将通过这个检查约束并允许记录被更新或插入。为了这个记录能够被插入或更新,与给定INSERT或UPDATE语句相关的所有数据都不能进行检查约束失败(返回一个FALSE值)。检查约束可以在字段级别或表级别被创建。

      在一个CREATE TABLE语句上创建检查约束

      创建检查约束的一个方法是在表创建时进行。这是一个简单的CREATE TABLE脚本,它创建了一个单独的检查约束:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      SalaryType nvarchar(10),

      Salary decimal(9,2)

      CHECK (Salary < 150000.00)

      );

      这里我有一个CHECK 子句,它与Salary字段关联。这是一个字段级别的约束。如果你创建一个字段级别的约束,那么你在你的检查约束的逻辑表达式中只能使用这个字段名称。这个检查约束只允许Salary字段低于$150,000.00。当我的表创建之后,这个CHECK约束也将被创建,并被赋予一个系统生成的约束名称。如果你想在一个CREATE TABLE操作期间命名你的检查约束,那么你可以运行下面的代码:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      SalaryType nvarchar(10),

      Salary decimal(9,2)

      CONSTRAINT CK_Payroll_Salary CHECK (Salary < 150000.00)

      );

    这里我命名了我的检查约束CK_Payroll_Salary。

      上面的每个例子都创建了一个单独的条件字段检查约束。一个检查约束表达式可以有多个条件。下面是一个例子,它显示了一个有多个条件的检查约束:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      SalaryType nvarchar(10),

      Salary decimal(9,2)

      CONSTRAINT CK_Payroll_Salary

      CHECK (Salary > 10.00 and Salary < 150000.00)

      );

      记住,为了让SQL Server 拒绝一条记录,这个检查约束的逻辑表达式的最终结果需要是FALSE。因此,在这个例子中,这个检查约束验证了一个Salary大于$10.00并小于$150,000.00。当这个检查约束中的这些条件中的任何一个为FALSE,那么在Payroll表中将不会插入或更新一条记录,并会显示一个错误信息。

      如果你想创建一个表级别的检查约束,那么你可以运行下面的代码:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      Salary decimal(9,2),

      SalaryType nvarchar(10),

      CHECK (Salary > 10.00 and Salary < 150000.00)

      );

      这里我创建了一个单独的表约束,它检查Salary字段,但是它不是关联到字段,而是关联到这个表。在这个检查约束中我可以使用我的表中的任何字段,只要我想,因为它是一个表检查约束,但是在我的例子中,我只使用了Salary字段。注意,这个CHECK子句将使得SQL Server生成一个检查约束名称,因为我没有给这个约束名称。

      在一个现有的表上创建一个检查约束

      有时,在你设计和创建了一个表后,你想对一个表添加一个检查约束。这可以通过使用ALTER TABLE 语句来完成。下面是这么做的例子:

      

    ALTER TABLE dbo.Payroll

      WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

      CHECK (SalaryType in ('Hourly','Monthly','Annual'));

      在这里我创建了一个检查约束,它将检查我的Payroll表中的所有记录在SalaryType字段中只有“Hourly”、“ Monthly”或“Annual”值。我还用一个名称命名了我的检查约束,在这个例子中是“CK_Payroll_SalaryType”。

      上面的每个例子都创建了一个单独的条件字段检查约束。一个检查约束表达式可以有多个条件。下面是一个例子,它显示了一个有多个条件的检查约束:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      SalaryType nvarchar(10),

      Salary decimal(9,2)

      CONSTRAINT CK_Payroll_Salary

      CHECK (Salary > 10.00 and Salary < 150000.00)

      );

      记住,为了让SQL Server 拒绝一条记录,这个检查约束的逻辑表达式的最终结果需要是FALSE。因此,在这个例子中,这个检查约束验证了一个Salary大于$10.00并小于$150,000.00。当这个检查约束中的这些条件中的任何一个为FALSE,那么在Payroll表中将不会插入或更新一条记录,并会显示一个错误信息。

      如果你想创建一个表级别的检查约束,那么你可以运行下面的代码:

      

    CREATE TABLE dbo.Payroll

      (

      ID int PRIMARY KEY,

      PositionID INT,

      Salary decimal(9,2),

      SalaryType nvarchar(10),

      CHECK (Salary > 10.00 and Salary < 150000.00)

      );

      这里我创建了一个单独的表约束,它检查Salary字段,但是它不是关联到字段,而是关联到这个表。在这个检查约束中我可以使用我的表中的任何字段,只要我想,因为它是一个表检查约束,但是在我的例子中,我只使用了Salary字段。注意,这个CHECK子句将使得SQL Server生成一个检查约束名称,因为我没有给这个约束名称。

      在一个现有的表上创建一个检查约束

      有时,在你设计和创建了一个表后,你想对一个表添加一个检查约束。这可以通过使用ALTER TABLE 语句来完成。下面是这么做的例子:

      

    ALTER TABLE dbo.Payroll

      WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

      CHECK (SalaryType in ('Hourly','Monthly','Annual'));

      在这里我创建了一个检查约束,它将检查我的Payroll表中的所有记录在SalaryType字段中只有“Hourly”、“ Monthly”或“Annual”值。我还用一个名称命名了我的检查约束,在这个例子中是“CK_Payroll_SalaryType”。  

    你可以使用一个单独的ALTER TABLE语句来一次添加多个检查约束到你的表中。下面是这么做的例子:

      

    ALTER TABLE dbo.Payroll

      WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

      CHECK (SalaryType in ('Hourly','Monthly','Annual')),

      CONSTRAINT CK_Payroll_Salary

      CHECK (Salary > 10.00 and Salary < 150000.00);

      在这里我已经使用一个单独的ADD CONSTRAINT子句添加了SalaryType和Salary约束。

      创建多个字段约束

      你没有必要创建只能检查一个单独字段的值的约束。你可以创建一次检查多个字段中的值的约束。例如,如果我想创建一个检查上面所创建的Salary和SalaryType约束的单独约束,那么可以使用下面的代码:

      

    ALTER TABLE dbo.Payroll WITH NOCHECK

      ADD CONSTRAINT CK_Payroll_Salary_N_SalaryType

      CHECK (SalaryType in ('Hourly','Monthly','Annual')

      and Salary > 10.00 and Salary < 150000.00);

      这个单独约束所做的事情和上面两个约束一样。记住,当你这么做时,要了解是SalaryType 、Salary 还是两个字段都违反了你的检查约束就更很困难了。.

      前一个例子的另一个方法是在不只一个的字段中使用这个值,从而确定某一指定字段值是否是有效的。例如,假设我想确保当我输入一个“Hourly” SalaryType时,我希望Salary小于$100.00,或输入“Monthly” SalaryType时,Salary不超过$10,000,而当输入一个“Annual” SalaryType时任何Salary数值都可以。要实现这个约束,我使用下面的ADD CONSTRAINT子句:

      

    ALTER TABLE dbo.Payroll WITH NOCHECK

      ADD CONSTRAINT CK_Payroll_SalaryType_Based_On_Salary

      CHECK ((SalaryType = 'Hourly' and Salary < 100.00) or

      (SalaryType = 'Monthly' and Salary < 10000.00) or

      (SalaryType = 'Annual'));

      这里,我将多个字段条件一起使用并使用一个“or”条件来分隔它们,所以我的检查约束可以验证每个不同的SalaryType的Salary数量。

      了解当值为Null时会发生什么

      回忆下在本篇文章的“什么是检查约束”章节中所说的关于记录是怎样只在检查约束得出结果FALSE时才认为检查约束没有通过。因此,字段中的NULL值可能允许你输入数据到你的数据库中,而这并不满足你的需求。

    假设我在我的payroll表上只有CK_Paryroll_SalaryType 检查约束。这里需要回忆的就是这个检查约束:

      

    ALTER TABLE dbo.Payroll

      WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

      CHECK (SalaryType in ('Hourly','Monthly','Annual'));

      现在你运行下面的INSERT语句:

      INSERT INTO dbo.Payroll values (1, 1, 'Hourly',25.00);

      INSERT INTO dbo.Payroll values (2, 2, NULL, 25.00);

      INSERT INTO dbo.Payroll values (3, 3, 'Horly',25.00);

      会发生什么?会只有第一个INSERT语句起作用吗?第二个和第三个INSERT语句会怎样?它们都违反CK_Payroll_SalaryType吗?结果是只有第三个INSERT语句失败了。它失败是由于SalaryType输入错误,它不是“Hourly”、“ Monthly”或“Annual”。为什么第二个INSERT没有得出false呢?显然,“NULL”不是SalaryTypes的有效值。第二个INSERT语句起作用的原因是在第二个INSERT语句运行时,CK_Payroll_SalaryType约束不是FALSE。因此,数据库引擎插入了这条记录。那么为什么会出现这种情况呢?这是因为NULL值用在比较操作中时,它被当作UNKNOWN。因为UNKNOWN不是FALSE,所以没有违反检查约束。因此,当你编写你的检查约束时,你需要对需要拒绝包含NULL值的地方很谨慎。另一个编写上面的约束从而使得拒绝SalaryType值为NULL的方法是如下编写你的约束:

      

    ALTER TABLE dbo.Payroll

      WITH NOCHECK ADD CONSTRAINT CK_Payroll_SalaryType

      CHECK ((SalaryType in ('Hourly','Monthly','Annual'))

      and SalaryType is not NULL);

      另一个选择是使SalaryType成为一个非NULL字段。如果你这么做就不会违反检查约束,但是反过来你会得到一个错误信息显示你不能插入一个NULL值到你的表中。

      通过检查约束进行数据验证

      通过使用检查约束,你可以确保你的数据库只包含通过了约束的数据。这使得你可以让数据库引擎控制你的数据验证。这么做将使得你的应用程序不需要在每个你希望插入一条记录或更新一条记录到一个表中的地方都写数据验证规则的代码。检查约束是执行数据验证的一个简洁方法。

    展开全文
  • MySQL,提供了CHECK检查约束用来指定某列的取值的范围,它通过限制输入到列的值来强制域的完整性。但是目前的MySQL版本只是对CHECK约束进行了分析处理,但会被直接忽略,并会报错。 示例:创建学生信息表...

    在MySQL中,提供了CHECK检查约束用来指定某列的可取值的范围,它通过限制输入到列中的值来强制域的完整性。但是目前的MySQL版本只是对CHECK约束进行了分析处理,但会被直接忽略,并不会报错。

    示例:创建学生信息表tb_student时,将年龄(age)的值设置在1至100之间的数值。

    -- 学生信息表
    CREATE TABLE tb_student
    (
    	id INT AUTO_INCREMENT PRIMARY KEY,
    	name VARCHAR(30),
    	age INT NOT NULL CHECK(age>0 AND age<100)
    );

    上述示例中,虽然给年龄(age)字段设置了CHECK检查约束,但是仍然可以往该数据表中添加不符合要求的年龄数组,例如:-1或者120。

    解决方法:使用触发器实现CHECK检查约束的功能。

    (1)创建tb_student(学生信息表)。

    -- 创建学生信息表
    CREATE TABLE tb_student
    (
    	id INT AUTO_INCREMENT PRIMARY KEY,
    	name VARCHAR(30),
    	age INT NOT NULL
    );
    

    (2)创建检查年龄(age)字段是否有效的触发器。

    -- 创建触发器
    CREATE TRIGGER trg_tb_student_insert_check BEFORE INSERT
    ON tb_student FOR EACH ROW
    BEGIN
    	DECLARE msg varchar(100);
     
    	IF NEW.age <= 0 OR NEW.age >= 100 
    	THEN
    		SET msg = CONCAT('您输入的年龄值:',NEW.age,' 为无效的年龄,请输入0到100以内的有效数字。');
    		SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
    	END IF;
    END;

    (3)编写测试语句。

    INSERT INTO tb_student(name,age) VALUES('pan_junbiao的博客',120);

    执行结果:

     

    展开全文
  • 数据库开发,约束是必不可少,使用约束可以更好的保证数据的完整性。 检查约束 使用检查约束可以来约束字段值的合法范围。 范例:创建一张表性别只能是 1 或 2 示例图: 此时,对于表性别列只能...

    SQL

    约束

    • 在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。
    检查约束
    • 使用检查约束可以来约束字段值的合法范围。

    • 范例:创建一张表性别只能是 1 或 2

    • 示例图:
      在这里插入图片描述
      在这里插入图片描述
      此时,对于表中性别列只能插入 1 或者 2!

    • 检查约束也可以自定义

    • 示例图:
      在这里插入图片描述
      在这里插入图片描述

    以上操作完整源码:

    --检查约束
    create table person(
           person_id  number(4) ,
           pname      varchar2(10),
           gender     number(1) check (gender in(1, 2)),
           birthday   date
    );
      
    --自定义检查约束名称 
    create table person(
           person_id  number(4) ,
           pname      varchar2(10),
           gender     number(1),
           birthday   date,
           constraint person_gender_ck check (gender in (1,2))
    );
    

    如有错误,欢迎指正!

    展开全文
  • 数据插入时报ORA-02290: 违反检查约束条件(NAMIBIAWEB.SYS_C0069731),这明显是设置不可为空的字段上插入为空内容导致,但是检查数据库表后发现,字段设置为可为空,又查看了建表语句发现该字段依然是可以为空,...

    问题描述

    工作中使用工具备份数据,从前置库导入到备份库。数据插入时报ORA-02290: 违反检查约束条件(NAMIBIAWEB.SYS_C0069731),这明显是在设置不可为空的字段上插入为空内容导致,但是检查数据库表后发现,字段设置为可为空,又查看了建表语句发现该字段依然是可以为空,同时有一个奇怪的现象,报错信息中的SYS_C0069731在数据库表中查询不到信息。

    针对这一莫名问题的报错,我开始查看程序中关于数据库插入处是否存在字段非空约束的内容,结果并未发现任何约束信息。

            我使用SQL语句直接在数据库中插入空数据,报错信息为ORA-xxx:check xxxx,这里捕捉到一个关键信息check,check约束也是oracle数据库中的一种约束条件,对于oracle数据库来说约束有五种类型: 1、主键约束( Primary key, 简称 PK) 、 2、非空约束( not null , 简称 NN ) 、 3、唯一约束( Unique , 简称 UK ) 、4、检查约束( Check , 简称 CK ) 、 5、外键( Foreign key, 简称 FK ),此处出现的check属于其中。

    解决方法:

    首先要确定约束在哪一字段上,使用sql:,(这里要注意TABELNAME必须是大写,表示业务表名称)

    select * from user_constraints where table_name='TABLENAME'

    这样数据表所有的约束都会呈现出来,如图:

    找到报错中SYS_C00105792约束条件,若本sql确能查询出该SYS_C00105792,删除该check约束问题也就可以解决,查看search_condition字段可以确定该约束使用在哪个字段上。

      删除check语句:

    ALTER TABLE TABLENAME DROP CONSTRAINT SYS_C0069731

    【注:这里不需要使用引号】

     

    展开全文
  • Oracle 约束

    2019-10-08 04:46:38
     |- 例如:身份证编号是唯一的,不可重复的,不可为空的 · 唯一约束:一个表只允许建立一个主键约束,而其他列如果不希望出现重复值的话,则就可以使用唯一约束 · 检查约束:检查一个列的内容是否合法 ...
  • 如果要检查泛型列表的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义...
  • 约束在Oracle的作用与其字面意思相同,是对一个字段进行限制,分为六类(非空,主键,外键,检查,默认,唯一)。 非空约束(not null):该字段可以视图建表时使用,一般为非空或not null等标识,当勾选该选项...
  • 一、已有数据表,添加一个约束,但让这个约束使用到已存在的数据执行ALTER TABLE语句添加时使用WITH NOCHECK子句,这样新增的约束就不会去约束已存在的数据,而只会对新增的数据进行约束检查: ...
  • 可以CHECK条件中使用任意有效的SQL表达式,CHECK约束对于插入、更新等任何对数据进行变化的操作都进行检查字段定义后添加CHECK 表达式就可以为这个字段添加CHECK约束,几乎所有字段中都...
  • 约束的创建和管理

    2020-01-01 22:33:12
    数据类型(忽略)、非空约束、唯一约束、主键约束、检查约束、外键约束。 1、非空约束(NOT NULL,NK) 非空约束可以说是整个约束之最特殊的一个,而且设置的方式与其它的四种约束太一样,只需要表创建的...
  • 数据库表的开发约束是必不可少的支持,使用约束可以更好的保证数据库数据的完整性。 约束主要分为以下几种: 主键约束:主键表示唯一的标识,不能为空,如×××编号 唯一约束一个表...
  • yeet_dba-查找缺少的外键约束 yeet_dbarails表扫描缺少的外键约束。 如果没有悬挂的记录,它将创建一个迁移以所有安全的表上添加外键约束。 如果您有悬而未决的迁移,请检查生成器日志以... 外键约束可防止您
  • 空间数据质量通常涉及几何之间的更高阶关系。 正如强大的非空间模型将强制执行外键关系一样,空间约束可用于强制执行空间...创建一个检查规则(插入和更新时候使用): CREATE OR REPLACE FUNCTION overlapping_parc
  • restrict(约束):当父表(即外键的来源表)删除对应记录时,首先检查该记录是否有对应外键,如果有则允许删除。 no action:意思同restrict.即如果存在从数据,允许删除主数据。 cascade(级联):当父表(即...
  • 只需脚本中使用#!/usr/bin/tarantool而不是#!/usr/bin/lua 。 全面支持Lua模块和丰富的自有模块,包括协作式多任务处理,非阻塞I / O,对外部数据库的访问等 数据库的主要功能: ANSI SQL,包括视图,联接,...
  • 我们研究了从强子化和喷淋建模引起的蒙特卡洛确定性,该模型是从顶部衰变中使用专有强子最终状态的观测值(例如t→任何+ J /ψ或t→任何+(B→ 带电轨道),其中B是B强子。 为此,我们调查了顶夸克质量对事件...
  • 1.3.1 日期范围搜索中使用BETWEEN 7 1.3.2 使用比较运算符 8 1.3.3 检测NULL值 9 1.3.4 基于一组值返回行 9 1.3.5 LIKE和通配符结合使用 9 1.3.6 声明变量及为变量赋值 11 1.4 数据分组 12 1.4.1 ...
  • 为了尽量减小单板设计的串扰问题,PCB设计完成之后一般要...由于代码的使用频率较低,做说明,如果读者想了解可以参考Altium Designer的文档,弄清楚每一个代码的含义再进行编辑。此,自定义代码编辑框输入
  • 一、ESlint的使用 (1)ESlint是用来做什么的? ESlint官网介绍是组装的...对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具JavaScript 是一个动态的弱类型语言,开发比较容易出错。因...
  • 团队开发过程为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的,这里分享一份我们定义mysql开发设计规范包括表设计规范,字段设计规范,sql编写规范数据库对象命名规范数据库对象命名...
  • 项目对话学习器使您能够构建和教授面向任务的对话界面,该界面从示例交互学习,结合代码,逻辑约束和机器学习。 您的应用程序的某些绝对部分(例如,检查用户是否登录或发出API请求以检查商店库存)仍可以进行...
  • 当导入数据的时候,经常会出现报告外键错误,这是由于表有外键约束,但导入数据时数据可能还没完整,所以会出现... #导入的脚本命令行最前面设置为不检查外键约束 2、。。。。。。。。。。。。 #导入数据的命令
  • 大规模系统产品线工程的情况下,手动配置通常是强制性的,因此不可避免地会引入不符合项:违反预定义约束进行一致性检查没有大型工具的情况下解决不合格问题或多或少是随机的,因为配置大规模且可直接部署...
  • 这是一个有意的设计选择,因此OMPL受特定的碰撞检查程序或可视化前端的约束。该库的设计使其可以轻松集成到提供其他所需组件的系统。 OMPL官方网站 安装 进入安装说明页面: /ompl-1.5.0/build/Release/bin...
  • PLSQL Developer 8.0.3.1510 简体中文绿色破解版

    万次下载 热门讨论 2010-07-15 16:36:07
     To-Do条目——您可以任何SQL或PL/SQL源文件中使用To-Do条目快速记录该文件中那些需要进行的事项。以后能够从To-Do列表中访问这些信息,访问操作可以对象层或工程层进行。  对象浏览器——配置的树形浏览...
  • #一般会将代表训练轮数的变量通过trainable参数设置为不可训练的 training_step = tf.Variable(0,trainable=False) #定义得到隐藏层和输出层的前向传播计算方式,激活函数使用relu() def hidden_layer(input_...
  • 关于对称的形状

    2020-04-21 13:57:10
    使用最近从包含性质子和氘核深层非弹性散射(DIS)提取的中子结构函数的重新分析数据,我们重新检查了质子d-u对称形状大部分动量分数x上的约束。 。 对BCDMS,NMC,SLAC和Jefferson Lab DIS测量以及Fermilab...
  • MYSQL中文手册

    2013-03-11 21:21:34
    5.12.3. 多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 144
精华内容 57
关键字:

不可在检查约束中使用