AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 167861
Accepted
BanksySan
BanksySan
Asked: 2017-03-23 04:35:32 +0800 CST2017-03-23 04:35:32 +0800 CST 2017-03-23 04:35:32 +0800 CST

什么是 WITH CHECK CHECK 约束?

  • 772

我有一些自动生成的 T-SQL,这可能是有效的,但我不太明白。

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];

我知道外键约束是什么,但它是什么CHECK CHECK?

sql-server t-sql
  • 2 2 个回答
  • 53847 Views

2 个回答

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2017-03-23T04:58:16+08:002017-03-23T04:58:16+08:00

    MSDN 文档页面关于ALTER TABLE解释这些:

    • ALTER TABLE:修改表的结构
      (以及一些可能的操作/修改):
      • CHECK CONSTRAINT ..: 启用约束
      • NOCHECK CONSTRAINT ..: 禁用约束
        在创建/启用/禁用约束时还需要执行其他可选步骤:
        • WITH CHECK: 也检查约束
        • WITH NOCHECK: 不检查约束

    用他们的话来说:

    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
        { ALL | constraint_name [ ,...n ] }
    

    ...

    WITH CHECK | WITH NOCHECK 指定表中的数据是否针对新添加或重新启用FOREIGN KEY或CHECK约束进行验证。如果未指定,WITH CHECK则假定为新约束,并WITH NOCHECK假定为重新启用的约束。

    如果您不想针对现有数据验证新的CHECK或FOREIGN KEY约束,请使用WITH NOCHECK. 我们不建议这样做,除非在极少数情况下。新约束将在以后的所有数据更新中进行评估。添加约束时抑制的任何约束违规都WITH NOCHECK可能导致将来的更新失败,如果它们使用不符合约束的数据更新行。

    查询优化器不考虑已定义的约束WITH NOCHECK。ALTER TABLE在使用table重新启用这些约束之前,这些约束将被忽略WITH CHECK CHECK CONSTRAINT ALL。

    ...

    { CHECK | NOCHECK } CONSTRAINT
    指定启用或禁用约束名称。此选项只能与FOREIGN KEY和CHECK约束一起使用。指定时NOCHECK,将禁用约束,并且不会根据约束条件验证对列的未来插入或更新。DEFAULT, PRIMARY KEY, 和UNIQUE约束不能被禁用。

    在dbfiddle中测试:

    CREATE TABLE a (aid INT PRIMARY KEY);
    

    去

    ✓
    
    INSERT INTO a (aid)
    VALUES (1), (2), (3) ;
    

    去

    3 行受影响
    
    CREATE TABLE b 
    ( aid INT,
      bid INT PRIMARY KEY,
      CONSTRAINT [My_FORIEGN_KEY]
        FOREIGN KEY (aid) REFERENCES a (aid)
    ) ;
    

    去

    ✓
    
    INSERT INTO b (aid, bid)
    VALUES
      (1, 11),
      (1, 12),
      (2, 21), 
      (3, 31) ;
    

    去

    4 行受影响
    
    INSERT INTO b (aid, bid)
    VALUES
      (6, 61),
      (6, 62) ;
    

    去

    消息 547 级别 16 状态 0 第 1 行
    INSERT 语句与 FOREIGN KEY 约束“My_FORIEGN_KEY”冲突。冲突发生在数据库“fiddle_792fce5de09f42908c3a0f91421f3522”、表“dbo.a”、“aid”列中。
    消息 3621 级别 0 状态 0 第 1 行
    该语句已终止。
    
    SELECT * FROM b ;
    

    去

    援助| 出价
    --: | --:
      1 | 11
      1 | 12
      2 | 21
      3 | 31
    
    ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY];   --disable
    

    去

    ✓
    
    INSERT INTO b (aid, bid)
    VALUES
      (4, 41),
      (4, 42) ;
    

    去

    2 行受影响
    
    SELECT * FROM b ;
    

    去

    援助| 出价
    --: | --:
      1 | 11
      1 | 12
      2 | 21
      3 | 31
      4 | 41
      4 | 42
    
    ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
    -- enable constraint without checking existing data
    

    去

    ✓
    
    SELECT * FROM b ;
    

    去

    援助| 出价
    --: | --:
      1 | 11
      1 | 12
      2 | 21
      3 | 31
      4 | 41
      4 | 42
    
    INSERT INTO b (aid, bid)
    VALUES
      (6, 61),
      (6, 62) ;
    

    去

    消息 547 级别 16 状态 0 第 1 行
    INSERT 语句与 FOREIGN KEY 约束“My_FORIEGN_KEY”冲突。冲突发生在数据库“fiddle_792fce5de09f42908c3a0f91421f3522”、表“dbo.a”、“aid”列中。
    消息 3621 级别 0 状态 0 第 1 行
    该语句已终止。
    
    SELECT * FROM b ;
    

    去

    援助| 出价
    --: | --:
      1 | 11
      1 | 12
      2 | 21
      3 | 31
      4 | 41
      4 | 42
    
    ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
    -- check existing data and enable constraint 
    

    去

    消息 547 级别 16 状态 0 第 1 行
    ALTER TABLE 语句与 FOREIGN KEY 约束“My_FORIEGN_KEY”冲突。冲突发生在数据库“fiddle_792fce5de09f42908c3a0f91421f3522”、表“dbo.a”、“aid”列中。
    
    • 47
  2. George K
    2017-03-23T04:47:55+08:002017-03-23T04:47:55+08:00

    考虑在这里阅读这篇文章: https ://msdn.microsoft.com/en-us/library/ms190273.aspx

    它告诉我们:

    查询优化器不考虑用 NOCHECK 定义的约束。在使用 ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL 重新启用这些约束之前,它们将被忽略

    另外,请考虑 StackOverflow 上的这个线程: https ://stackoverflow.com/questions/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve