【问题标题】:SQL Server 2008 select constraints order by primary keySQL Server 2008 按主键选择约束顺序
【发布时间】:2013-06-13 11:56:44
【问题描述】:

我有以下 SQL 语句来检索删除约束语句。

SELECT DISTINCT 'ALTER TABLE '+TABLE_NAME+' DROP CONSTRAINT '+CONSTRAINT_NAME AS 'DropConstraintStatement'
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE TABLE_NAME = 'USER';

这个查询的结果是:

  1. ALTER TABLE UNITS DROP CONSTRAINT FK_USER_TASK_ID
  2. ALTER TABLE UNITS DROP CONSTRAINT PK_USER
  3. ALTER TABLE UNITS DROP CONSTRAINT UQ_USER_NAME_VERSION

我想在 Java 应用程序中执行这些语句,因此我需要对这些语句进行排序,以便删除主键约束位于最后一个位置,例如:

  1. ALTER TABLE UNITS DROP CONSTRAINT FK_USER_TASK_ID
  2. ALTER TABLE UNITS DROP CONSTRAINT UQ_USER_NAME_VERSION
  3. ALTER TABLE UNITS DROP CONSTRAINT PK_USER

有没有很好的可能性用原生 SQL 做到这一点?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sorting constraints


    【解决方案1】:

    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 没有必要的信息来区分 PK 和其他约束。如果您确定您的 PK 名称以 PK 开头 您可以尝试像这样添加ORDER BY

    ORDER BY CASE WHEN CONSTRAINT_NAME LIKE 'PK%' THEN 1 ELSE 0 END
    

    但是,我建议切换到 SQL Server 系统视图以获得更精确的数据。 sys.key_constraints 保存有关主键和唯一约束的信息,sys.foreign_keys 保存有关外键的信息。

    WITH CTE AS 
    (
        SELECT OBJECT_NAME(parent_object_id) AS TABLE_NAME
            , name AS CONSTRAINT_NAME, Type
        FROM sys.key_constraints
        WHERE parent_object_id = object_id('YourTable')
    
        UNION
    
        SELECT OBJECT_NAME(parent_object_id) AS TABLE_NAME
            , name AS CONSTRAINT_NAME, Type
        FROM sys.foreign_keys
        WHERE parent_object_id = object_id('YourTable')
    )
    SELECT 'ALTER TABLE '+TABLE_NAME+' DROP CONSTRAINT '+CONSTRAINT_NAME AS 'DropConstraintStatement'
    FROM CTE 
    ORDER BY CASE WHEN Type = 'PK' THEN 1 ELSE 0 END
    

    【讨论】:

    • 感谢您的出色回答!这对我来说可以。我也刚刚添加了联合检查约束,以防该表存在这样的约束。
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多