📜  SQL |使用数据字典检查表上的现有约束

📅  最后修改于: 2022-05-13 01:55:27.792000             🧑  作者: Mango

SQL |使用数据字典检查表上的现有约束

先决条件:SQL 约束

在 SQL Server 中,数据字典是一组数据库表,用于存储有关数据库定义的信息。可以使用这些数据字典来检查已经存在的表上的约束并更改它们(如果可能的话)。

  • USER_CONSTRAINTS 数据字典:此数据字典包含有关数据库中使用的每个约束的信息以及特定于约束的信息。
    DESC USER_CONSTRAINTS;
    
    Name              Null     Type         
    ----------------- -------- ------------ 
    OWNER                      VARCHAR2(30) 
    CONSTRAINT_NAME   NOT NULL VARCHAR2(30) 
    CONSTRAINT_TYPE            VARCHAR2(1)  
    TABLE_NAME        NOT NULL VARCHAR2(30) 
    SEARCH_CONDITION           LONG         
    R_OWNER                    VARCHAR2(30) 
    R_CONSTRAINT_NAME          VARCHAR2(30) 
    DELETE_RULE                VARCHAR2(9)  
    STATUS                     VARCHAR2(8)  
    DEFERRABLE                 VARCHAR2(14) 
    DEFERRED                   VARCHAR2(9)  
    VALIDATED                  VARCHAR2(13) 
    GENERATED                  VARCHAR2(14) 
    BAD                        VARCHAR2(3)  
    RELY                       VARCHAR2(4)  
    LAST_CHANGE                DATE         
    INDEX_OWNER                VARCHAR2(30) 
    INDEX_NAME                 VARCHAR2(30) 
    INVALID                    VARCHAR2(7)  
    VIEW_RELATED               VARCHAR2(14) 
    

    约束类型有:

    C - Check constraint on a table  
    P - Primary key  
    U - Unique key  
    R - Referential integrity  
    V - With check option, on a view  
    O - With read only, on a view  
    H - Hash expression  
    F - Constraint that involves a REF column  
    S - Supplemental logging
    

    现在考虑以下源表“SDF”:

    SUPPNO  SNAME   STATUS  CITY
    21    JONYY    25    NY
    22    MIKKY    11    LA
    23    JIM    29    LV
    24    BNFERYY    47    HW
    25    TIM    41    HS
    

    用于检查此表上的约束的查询:

    SELECT CONSTRAINT_NAME, SEARCH_CONDITION AS CONSTRAINT_TYPE 
    FROM USER_CONSTRAINTS 
    WHERE TABLE_NAME='SDF';
    

    输出

    CONSTRAINT_NAMECONSTRAINT_TYPE
    XYZSTATUS<50
    Abc(NULL)

  • USER_CONS_COLUMNS 数据字典:
  • 我们可以使用此数据字典来查找已应用约束的列。
    DESC USER_CONS_COLUMNS;
    
    Name            Null     Type           
    --------------- -------- -------------- 
    OWNER           NOT NULL VARCHAR2(30)   
    CONSTRAINT_NAME NOT NULL VARCHAR2(30)   
    TABLE_NAME      NOT NULL VARCHAR2(30)   
    COLUMN_NAME              VARCHAR2(4000) 
    POSITION                 NUMBER     
    

    查询以检查具有约束的 SDF 表的列:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME='SDF';
    

    输出

    OWNERCONSTRAINT_NAMETABLE_NAMECOLUMN_NAMEPOSITION
    SYSTEMXYZSDFSTATUS(null)
    SYSTEMABCSDFSTATUS1
  • 使用笛卡尔积获取有关约束的完整信息:
    SELECT A.CONSTRAINT_NAME, A.CONSTRAINT_TYPE, B.COLUMN_NAME, B.TABLE_NAME
    FROM 
    USER_CONSTRAINTS A,
    USER_CONS_COLUMNS B
    WHERE A.CONSTRAINT_NAME=B.CONSTRAINT_NAME
    AND A.TABLE_NAME='SDF';
    

    输出

    CONSTRAINT_NAMECONSTRAINT_TYPECOLUMN_NAMETABLE_NAME
    XYZCSTATUSSDF
    ABCPSUPPNOSDF