精华内容
下载资源
问答
  •  检查约束是一个规则,它确认一个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 8.0 新特性之检查约束(CHECK)

    千次阅读 多人点赞 2020-06-05 14:52:42
    介绍 MySQL 8.0 增加的新功能:检查约束(CHECK ),定义列级检查约束和表级检查约束检查约束的 enforced 选项,检查约束使用限制。

    大家好,我是只谈技术不剪发的 Tony 老师。这次我们来介绍一个 MySQL 8.0 增加的新功能:检查约束(CHECK )。

    SQL 中的检查约束属于完整性约束的一种,可以用于约束表中的某个字段或者一些字段必须满足某个条件。例如用户名必须大写、余额不能小于零等。

    我们常见的数据库都实现了检查约束,例如 Oracle、SQL Server、PostgreSQL 以及 SQLite;然而 MySQL 一直以来没有真正实现该功能,直到最新的 MySQL 8.0.16。

    MySQL 8.0.15 之前

    在 MySQL 8.0.15 以及之前的版本中,虽然 CREATE TABLE 语句允许CHECK (expr)形式的检查约束语法,但实际上解析之后会忽略该子句。例如

    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.15    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> CREATE TABLE t1
        -> (
        ->   c1 INT CHECK (c1 > 10),
        ->   c2 INT ,
        ->   c3 INT CHECK (c3 < 100),
        ->   CONSTRAINT c2_positive CHECK (c2 > 0),
        ->   CHECK (c1 > c3)
        -> );
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int(11) DEFAULT NULL,
      `c2` int(11) DEFAULT NULL,
      `c3` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1 row in set (0.00 sec)
    

    虽然我们在定义时指定了各种 CHECK 选项,但最终的表结构中不包含任何检查约束。这也意味着我们可以插入非法的数据:

    mysql> insert into t1(c1, c2, c3) values(1, -1, 100);
    Query OK, 1 row affected (0.06 sec)
    

    如果我们想要在 MySQL 8.0.15 之前实现类似的检查约束,可以使用触发器;或者创建一个包含 WITH CHECK OPTION 选项的视图,然后通过视图插入或修改数据。

    MySQL 8.0.16 之后

    MySQL 8.0.16 于 2019 年 4 月 25 日发布,终于带来了我们期待已久的 CHECK 约束功能,而且对于所有的存储引擎都有效。CREATE TABLE 语句允许以下形式的 CHECK 约束语法,可以指定列级约束和表级约束:

    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
    

    其中,可选的 symbol 参数用于给约束指定一个名称。如果省略该选项,MySQL 将会产生一个以表名开头、加上 _chk_ 以及一个数字编号(1、2、3 …)组成的名字(table_name_chk_n)。约束名称最大长度为 64 个字符,而且区分大小写。

    expr 是一个布尔表达式,用于指定约束的条件;表中的每行数据都必须满足 expr 的结果为 TRUE 或者 UNKNOWN(NULL)。如果表达式的结果为 FALSE,将会违反约束。

    可选的 ENFORCED 子句用于指定是否强制该约束:

    • 如果忽略或者指定了 ENFORCED,创建并强制该约束;
    • 如果指定了 NOT ENFORCED,创建但是不强制该约束。这也意味着约束不会生效。

    CHECK 约束可以在列级指定,也可以在表级指定。

    列级检查约束

    列级约束只能出现在字段定义之后,而且只能针对该字段进行约束。例如:

    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.16    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> CREATE TABLE t1
        -> (
        ->   c1 INT CHECK (c1 > 10),
        ->   c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
        ->   c3 INT CHECK (c3 < 100)
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int DEFAULT NULL,
      `c2` int DEFAULT NULL,
      `c3` int DEFAULT NULL,
      CONSTRAINT `c2_positive` CHECK ((`c2` > 0)),
      CONSTRAINT `t1_chk_1` CHECK ((`c1` > 10)),
      CONSTRAINT `t1_chk_2` CHECK ((`c3` < 100))
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    

    其中,字段 c1 和 c3 上的检查约束使用了系统生成的名称;c2 上的检查约束使用了自定义名称。

    📝SQL 标准中所有的约束(主键、唯一约束、外键、检查约束等)都属于相同的命名空间,意味着它们相互不能重名。但在 MySQL 中,每个数据库中的约束类型属于自己的命名空间;因此,主键和检查约束可以重名,但是两个检查约束不能重名。

    我们插入一条测试数据:

    mysql> insert into t1(c1, c2, c3) values(1, -1, 100);
    ERROR 3819 (HY000): Check constraint 'c2_positive' is violated.
    

    插入数据的三个字段都违反了约束,结果显示的是违反了 c2_positive;因为它按照名字排在第一,由此也可以看出 MySQL 按照约束的名字排序依次进行检查。

    我们再插入一条测试数据:

    mysql> insert into t1(c1, c2, c3) values(null, null, null);
    Query OK, 1 row affected (0.00 sec)
    

    数据插入成功,所以 NULL 值并不会违反检查约束。

    表级检查约束

    表级约束独立于字段的定义,而且可以针对多个字段进行约束,甚至可以出现在字段定义之前。例如:

    mysql> drop table t1;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> CREATE TABLE t1
        -> (
        ->   CHECK (c1 <> c2),
        ->   c1 INT,
        ->   c2 INT,
        ->   c3 INT,
        ->   CONSTRAINT c1_nonzero CHECK (c1 <> 0),
        ->   CHECK (c1 > c3)
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int DEFAULT NULL,
      `c2` int DEFAULT NULL,
      `c3` int DEFAULT NULL,
      CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)),
      CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)),
      CONSTRAINT `t1_chk_2` CHECK ((`c1` > `c3`))
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    

    第一个约束 t1_chk_1 出现在字段定义之前,但是仍然可以引用 c1 和 c2;第二个约束 c1_nonzero 使用了自定义的名称;第三个约束 t1_chk_2 在所有字段定义之后。

    我们同样插入一些测试数据:

    mysql> insert into t1(c1, c2, c3) values(1, 2, 3);
    ERROR 3819 (HY000): Check constraint 't1_chk_2' is violated.
    
    mysql> insert into t1(c1, c2, c3) values(null, 2, 3);
    Query OK, 1 row affected (0.01 sec)
    

    第一条记录中的 c1 小于 c3,违反了检查约束 t1_chk_2;第二条记录中的 c1 为 NULL,检查约束 t1_chk_2 的结果为 UNKNOWN,不违法约束。

    强制选项

    使用默认方式或者 ENFORCED 选项创建的约束处于强制检查状态,我们也可以将其修改为 NOT ENFORCED,从而忽略检查:

    ALTER TABLE tbl_name
    ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
    

    修改之后的检查约束仍然存在,但是不会执行检查。例如:

    mysql> alter table t1 
        -> alter check t1_chk_1 not enforced;
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int DEFAULT NULL,
      `c2` int DEFAULT NULL,
      `c3` int DEFAULT NULL,
      CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)),
      CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)) /*!80016 NOT ENFORCED */,
      CONSTRAINT `t1_chk_2` CHECK ((`c1` > `c3`))
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    

    从最新的定义可以看出,t1_chk_1 处于 NOT ENFORCED 状态。我们插入一条违反该约束的数据:

    mysql> insert into t1(c1, c2, c3) values(1, 1, 0);
    Query OK, 1 row affected (0.01 sec)
    

    该记录的 c1 和 c2 相等,但是插入成功。

    如果我们需要迁移一些低版本的历史数据时,它们可能会违反新的检查约束;此时可以先将该约束禁用,等数据迁移并处理完成之后,再次启用强制选项。

    检查约束限制

    MySQL 中的 CHECK 条件表达式必须满足以下规则,否则无法创建检查约束:

    • 允许使用非计算列和计算列,但是不允许使用 AUTO_INCREMENT 字段或者其他表中的字段。
    • 允许使用字面值、确定性内置函数(即使不同用户,多次调用该函数,只要输入相同结果就相同)以及运算符。非确定性函数包括:CONNECTION_ID()、CURRENT_USER()、NOW() 等等,它们不能用于检查约束。
    • 不允许使用存储函数或者自定义函数。
    • 不允许使用存储过程和函数参数。
    • 不允许使用变量,包括系统变量、用户定义变量和存储程序的局部变量。
    • 不允许使用子查询。

    另外,禁用在 CHECK 约束字段上定义外键约束的参照操作(ON UPDATE、ON DELETE);同理,存在外键约束参照操作的字段上也不允许创建 CHECK 约束。

    对于 INSERT、UPDATE、REPLACE、LOAD DATA 以及 LOAD XML 语句,如果违反检查约束将会返回错误。此时,对于已经修改的数据处理取决于存储引擎是否支持事务,以及是否使用了严格 SQL 模式

    对于 INSERT IGNORE、UPDATE IGNORE、REPLACE、LOAD DATA … IGNORE 以及 LOAD XML … IGNORE 语句,如果违反检查约束将会返回警告并且跳过存在问题的数据行。

    如果约束表达式的结果类型和字段的数据类型不同,MySQL 将会执行隐式类型转换;如果类型转换失败或者丢失精度,将会返回错误。

    总结

    MySQL 8.0.16 新增的检查约束提高了 MySQL 实现业务完整性约束的能力,也使得 MySQL更加遵循 SQL 标准。😎

    如果觉得文章对你有用,请不要白嫖!欢迎关注❤️、评论📝、点赞👍!

    展开全文
  • 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);

    执行结果:

     

    展开全文
  • SQL 检查约束整理

    千次阅读 2013-02-19 13:09:44
    运算符:对于所有的运算符,分为单目运算符和双目运算符。 目:操作数 一、数学运算符:+ - * / % +5 -8 4+5 8-89 数学运算的结果仍是一个数字。 二、比较运算符: > = = (!= 比较运算符都是双目运算符...
    运算符:对于所有的运算符,可分为单目运算符和双目运算符。
    
    目:操作数
    一、数学运算符:+ - * / %
    +5  -8
    4+5  8-89
    数学运算的结果仍是一个数字。

    二、比较运算符:
    >  <  <=  >=  = (!= <>)
    比较运算符都是双目运算符。

    比较运算的结果是一个布尔值,即真或假,两者必居其一。

    三、逻辑运算符:
    and  or  not //   && || !也叫逻辑运算的“与、或、非”运算。
    三个逻辑运算符的操作数必须是布尔值。

    三个运算符中,其中and和or 运算符是双目或多目,而not为单目

    cheeck语句例子

    1.检查只能是男或者女

      add const ck_sex check(sex in('男,女')),

      add const ck_sex check(sex ='男' or sex ='女')

    2.在一个范围中间

    constraint ch_age check(sage>0 and sage<120),

    add const ck_age check(age between 12 and 30)

    3.长度大于某个值

    add const ck_lenght check(len(lenght)>6)

    4.数大于某个值

     add const ck_number ckeck(number>1)

    5.只能是8位字符,前两位是 0 ,3~4位为数字,第 5 位为下划线,6~8位为字母

    alter table 表名

    add constraint chkk  check((字段 like '00[0-9][0-9]/_[a-z,A-Z][a-z,A-Z][a-z,A-Z]%' escape '/')and(len(字段)=8) )

    或者是

    alter table 表名

    add constraint chkk  check((字段 like '00[0-9][0-9][_][a-z,A-Z][a-z,A-Z][a-z,A-Z]%')and(len(字段)=8) )

    6.电子邮箱要含有@符号

    check(字段like '%@%')

    7.SQL中用check约束一列的首字母为's'

    check(col1 like 's%')

    8.检查约束前3位和后8位均为数字字符:

    check(col2 like '[0-9][0-9][0-9]%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

    9.如何建立检查身份证的约束,身份证是18位,最后一位还有可能是X

    select 身份证号 from 表名

    where len(身份证号) = 18 and (right(身份证号,17) like  '[0-9]'or right(身份证号,17) like 'x')

    10.如何设置区号由0-9之间的数字组成

    CONSTRAINT  quhao CHECK (quhao  LIKE '[0-9][0-9][0-9]' 

    or quhao LIKE '[0-9][0-9][0-9][0-9]'or quhao LIKE '[0-9][0-9][0-9][0-9][0-9]'));

    解释: 其中quhao LIKE '[0-9]...[0-9]'的号码由表示n位从0到9中的数组成。

    quhao  LIKE '[0-9][0-9][0-9]' 表示3位的区号,如北京010;quhao LIKE '[0-9][0-9][0-9][0-9]'表示4位的区号,如三门峡0398; quhao LIKE 

    '[0-9][0-9][0-9][0-9][0-9]'表示5位的区号,如香港00852 

    11.最后回复时间 TLastClickT    发贴时间 TTime

    最后回复时间 必须晚于 发贴时间  并且小于等于当前时间 使用GetDate()函数获取当前时间

    设计表

    在TLastClickT上右击

    选择约束,新建,填入

    ([TLastClickT] > [TTime] and [TLastClickT] < GetDate())

    或者

    TiastReply(回帖时间)大于Ttime(发帖时间)在创表的同时

    创建表的时候应该还没有回帖吧,为什么要用默认值?

    可以添加一个约束 alter table topic alter column add check(TlastReply is null or TlastReply > Ttime)

    12.定义前八位为数字或者 -

    一共是15位,为CHAR型

    alter table 表名

    add constraint chk check(字段 like'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'),

        constraint chklen check(len(字段)=15)

    13.如何限制varchar字段不允许出现单引号的检查约束 !!!

    设表为TALBENAME,不能有引号的字段为FIELDNAME 则:

    ALTER TABLE tablename ADD CONSTRAINT CK_fieldname CHECK (not fieldname like '%''%')

    14.在表中的某列中通过检查约束,让其有某些固定的值

    check(sid like 'bd[0-9][0-9][0-9][0-9][0-9][0-9]')

    add const ck_num check(num like '[1][2] [4][_] [0-9][0-9] [0-9][a-z]')

    15.如何限制varchar字段不允许出现字符串的检查约束 !!!

    设表名为TABLENAME,VARCHAR类型的字段为VAR_FIELD.则有:

    ALTER TABLE [dbo].[TABLENAME] ADD CONSTRAINT [CK_TABLENAME] CHECK (isnumeric([VAR_FIELD]) = 1)

    这样,在VAR_FIELD只要出现字段一旦出现非数字内容就会报告错误。

    16.电话号码的格式必须为xxxx-xxxxxxxx或手机号11位 

    alter 表名 add constraint ck_字段名 check (字段 like '[0-9][0-9][0-9][0-9]_[0-9]......' or len(字段)=11)

    17.身份证号是18位且唯一的 

    alter 表名 add 

    constraint ck_字段名 check (len(字段名)=18 ),

    constraint uk_字段名 unique(字段名)

    展开全文
  • 数据库的检查约束check约束

    千次阅读 2015-11-01 22:32:28
    数据约束,主要有主键约束,外键约束,非空约束等。 主键约束其实就是非空唯一约束,非空唯一约束也可以通过建立唯一索引来实现,外键约束需要通过其他的表来帮助实现,非空约束在定义是数据库字段时就定义了...
  • SQL Server Check检查约束用法

    千次阅读 2019-10-22 12:02:04
    如果对一个表定义 CHECK 约束,那么此约束特定的列对值进行限制。 做数据库,就必须要会写约束。 二、将新的 CHECK 约束附加到表或列 1、附加新的 CHECK 约束   (1)、数据库关系图,右击包含约束的表...
  • 主键约束、唯一性约束、检查约束

    万次阅读 2011-12-09 11:51:08
    1.约束定义了必须遵循的的用户维护数据一致性和正确性的规则,是强制实现数 据完整性的主要途径。  主键约束(primary key)  唯一性约束(unique) ... 检查约束(check) 条件的构造  范围 字段 in(集合)
  • Oracle延迟约束Deferable的使用

    千次阅读 2014-11-25 18:05:30
    Oracle延迟约束Deferable的使用  标准规定,约束可以是deferrable或not deferrable(默认)。  not deferrable 约束在每一个DML语句后检查;  deferrable 约束可以每一个insert,delete,或update(即时模式)后...
  • 当向表的现有列添加 FOREIGN KEY 约束时,默认情况下 SQL Server 2005 数据库引擎 会检查的现有数据,以确保除 NULL 以外的所有值存在于被引用的 PRIMARY KEY 或 UNIQUE 约束。但是,通过指定 WITH ...
  • 数据库的五种约束

    万次阅读 多人点赞 2018-11-14 09:51:38
    数据库的五种约束 #五大约束 ... 3、检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)  4、默认约束 (Default Counstraint)该数据的默认值  5、外键约束 ...
  • PowerDesigner设计约束

    千次阅读 2012-07-27 09:42:18
    PowerDesigner设计物理模型2——约束 唯一约束 唯一约束与创建唯一索引基本上是一回事,因为创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束。不过唯一约束更直观的表达了对应...
  • 数据库应用之约束使用

    千次阅读 热门讨论 2013-08-18 16:12:11
    通俗来讲,就是一些条条框框,一些规则限制,数据库还有一个术语叫做规则,跟约束十分相似,这里我就谈规则了。 当创建数据库表和字段时,可以声明约束(constraint),以限制可以进入字段的数据,利用约束来...
  • Vivado使用技巧(29):约束功能概述

    万次阅读 多人点赞 2018-09-20 19:44:04
    但不是全部约束在所有过程中都会使用,比如物理约束只用布局和布线过程。Vivado工具的综合和实现算法时时序驱动型的,因此必须创建合适的时序约束。我们必须根据应用需求选择合理的约束,过度约束约束不足都会...
  •  如果客户端代码尝试使用某个约束允许的类型来实例化类,则会产生编译时错误。 这些限制称为约束。 约束使用 where 上下文关键字指定的。 下表列出了六种类型的约束约束 说明 T:结构...
  • C# where类型约束

    千次阅读 2011-09-16 16:57:58
    转载自MSDN 类型参数的约束(C# 编程指南) Visual Studio 2005 其他版本 定义泛型类时,可以对客户端代码能够实例化类时用于类型参数的类型种类施加限制。如果客户端
  • SQL的CONSTRAINT(约束)用法总结

    万次阅读 多人点赞 2018-07-17 10:55:09
     数据库中使用约束(constraints)是为了该数据库中实施所谓的"业务规则"其实就是防止非法信息进入数据库,满足管理员和应用开发人员所定义的规则集.  ORACLE使用完整性约束(integrity constraints)...
  • Sybase.PowerDesigner如何添加-约束

    千次阅读 2011-03-17 11:01:00
    Sybase.PowerDesigner如何添加-约束
  • ----------------检查约束-------------------

    千次阅读 2009-12-17 14:29:00
    检查约束是一个规则,它确认一个SQL Server表某条记录的数据接受的字段值。检查约束帮助执行域完整性。域完整性定义了一个数据库表字段的有效值。检查约束可以验证一个单独字段或一些字段的域完整性。你对...
  • sql表级约束和列级约束

    万次阅读 多人点赞 2017-03-19 16:02:41
    SQL SERVER, (1) 对于基本表的约束分为列约束和表约束 约束是限制用户输入到表的数据的值的范围,一般分为列级约束与表级约束。 列级约束有六种:主键Primary key、外键foreign key 、唯一 unique、检查...
  • Oracle约束类型有主键约束,唯一约束,外键约束,检查约束。 主键约束(primary key constraint) 主键约束:要求主键列数据唯一,并且能为空。 添加主键约束: 例如student表,为字段名为id(学生id)的这...
  • 数据库的数据完整性约束

    万次阅读 多人点赞 2018-06-14 18:43:33
    这篇文章讲的是数据库的数据完整性约束,如有错误或不当之处,还望各位大神批评指正。 什么是数据完整性约束? 数据完整性:存储数据库的所有数据值均正确的状态。它是应防止数据库存在符合语义规定的...
  • SQL的几种约束的创建与删除

    万次阅读 2017-03-11 22:39:32
    约束是SQL Server提供的自动保持数据库完整性的一种方法, 它通过限制字段数据、记录数据和表之间的数据来保证数据的完整性。约束分为以下几种:1、...4、CHECK 约束 检查约束 5、DEFUALT 定义 默认约束 一、主键
  • 使用sql语句创建和删除约束

    千次阅读 2014-06-09 09:12:44
    使用sql语句创建和删除约束 主建约束:(primary key ...检查约束:(check constraint); 默认约束:(default constraint); 外建约束:(foreign key constraint); *********************************************
  • 安装好后,Python输出版本检查是否是最新版(version 2.5.0): import geatpy as ea print(ea.__version__) 下面切入主题: 自然界生物周而复始的繁衍,基因的重组、变异等,使其不断具有新的性状,以适应...
  • 你知道吗?约束分为列级约束和表级约束。   如果我们了解了这件事情,那么当我们用T—SQL语句创建约束时,思路就会更加清晰。了解了这件事,相信我们会对约束有更进一步的理解。... 检查约束(check)
  • SQL约束

    千次阅读 2011-09-22 00:16:44
    SQL Server的运用过程种,对于初学者来说,总是会遇到很多棘手的问题,尤其对其中的约束种类就感到很吃力。以下是我借鉴别人后的发言后的一点心得体会。  约束是SQL Server提供的自动保持数据库完整性的一种方法...
  • 为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目。  一. unique 唯一性约束**  值不可重复;  二. not null 非空约束** ... 值不可为空;... 三.... 四. check 检查约束  mysql不支持该约...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,478
精华内容 59,791
关键字:

不可在检查约束中使用