代码改变世界

SQL Server 删除 和 创建 主键,外键,索引

2019-09-18 17:00  醒醒-  阅读(1089)  评论(1)    收藏  举报

问题:将表A的Id,CId,DId字段类型由int修改为bigint,但是表A的Id字段存在主键,外键,索引,CId,DId字段上存在check约束。

          必须先删除相关约束,才能对字段进行修改

1.删除主键

        IF EXISTS (SELECT * FROM sysobjects WHERE name = '主键名称')      --判断主键约束是否存在
               ALTER TABLE 表A DROP CONSTRAINT 主键名称
        GO

2.删除外键

   假设:表A与表B存在外键约束:表A的主键被表B的外键引用即:

            ALTER TABLE 表B ADD CONSTRAINT 外键名称 FOREIGN KEY(表B字段) REFERENCES 表A(Id)

   注:此处是表B引用表A字段,需先在表B处删除外键,才能修改表A  

      IF EXISTS (SELECT * FROM sysobjects WHERE name = '外键名称')    --判断外键约束是否存在
            ALTER TABLE 表B DROP CONSTRAINT 外键名称
      GO

3.删除索引

   IF EXISTS(SELECT 1 FROM sysindexes WHERE id=object_id('PasTransactions') AND name='索引名称')     --判断索引是否存在
        DROP INDEX 索引名称 ON 表A
   GO

4.删除Check约束

   IF EXISTS (SELECT * FROM sysobjects WHERE name = '约束名称')        --判断check约束是否存在
        ALTER TABLE 表A DROP CONSTRAINT 约束名称   
  GO

5.修改字段类型:int --> bigint    

   IF COL_LENGTH('表A', 'Id') IS NOT NULL                       --判断表A上Id字段是否存在
          ALTER TABLE 表A ALTER COLUMN Id BIGINT NOT NULL 
   GO

   IF COL_LENGTH('表A', 'CId') IS NOT NULL                       --判断表A上CId字段是否存在
          ALTER TABLE 表A ALTER COLUMN CId BIGINT 
   GO

   IF COL_LENGTH('表A', 'DId') IS NOT NULL                       --判断表A上DId字段是否存在
          ALTER TABLE 表A ALTER COLUMN DId BIGINT 
   GO

6.增加主键 

   IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '主键名称')        --判断主键是否存在
       ALTER TABLE 表A ADD CONSTRAINT 主键名称 PRIMARY KEY (Id)
   GO

7.增加外键

   注:此处表B引用表A字段,所以增加外键仍在表B上。

   IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '外键名称')      --判断外键是否存在
       ALTER TABLE 表B ADD CONSTRAINT 外键名称 FOREIGN KEY(表B字段) REFERENCES 表A(Id)
   GO

8.增加索引

   IF NOT EXISTS(SELECT 1 FROM sysindexes WHERE id=object_id('PasTransactions') AND name='索引名称')     --判断索引是否存在
       CREATE NONCLUSTERED INDEX 索引名称 ON 表A (Id)   

        --此处非聚集索引,聚集索引将NONCLUSTERED改为CLUSTERED
   GO

9.增加Check约束

   IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '约束名称')                      --判断Check约束是否存在
       ALTER TABLE 表A ADD CONSTRAINT 约束名称 CHECK([CId] IS NULL OR [DId] IS NULL)
   GO