2

ドロップ制約ステートメントを取得する次の 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 でこれを行う良い可能性はありますか?

4

1 に答える 1

2

INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGEPK と他の制約を区別するために必要な情報を保持していません。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
于 2013-06-17T14:19:12.780 に答える