10

セレインテーブルに主キーが存在するかどうかをテストするSQLスクリプトを理解しようとしています。テーブルに主キーがない場合、スクリプトはテーブル名を出力する必要があります。

Tables to test:
TableA
TableB
TableC

スクリプトを実行した後(そして、TableAとTableCにはPKがありますが、TableBはありません)、出力は次のようになります。

NoKeys
TableB
4

6 に答える 6

11

私はあなたのための正確な/完全なコードを持っていませんが、ここにアイデアがあります:

データベース内のテーブルのリストをループする必要があります。

SELECT *  
FROM information_schema.tables

テーブルに主キーが存在するかどうかを確認するコードは、次のようになります。

SELECT *  
FROM information_schema.table_constraints  
WHERE constraint_type = 'PRIMARY KEY'   
AND table_name = @Your_Table_Name
于 2012-11-06T19:55:17.003 に答える
10
;WITH tables_with_pk AS (
  SELECT t.table_schema, t.table_name  
  FROM INFORMATION_SCHEMA.TABLES t 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
      ON t.TABLE_NAME = tc.TABLE_NAME AND t.table_schema = tc.table_schema
  WHERE tc.constraint_type = 'PRIMARY KEY'
)
SELECT t.table_schema, t.table_name 
FROM INFORMATION_SCHEMA.TABLES t 
EXCEPT
SELECT table_schema, table_name
FROM tables_with_pk
于 2012-11-06T20:01:56.523 に答える
8

主キーがない場合は0を返し、主キーがある場合は1を返します

SELECT OBJECTPROPERTY(OBJECT_ID(N'MyTable'),'TableHasPrimaryKey')
于 2019-02-27T21:59:26.073 に答える
2

私のバージョン:

SELECT 1  
FROM SYS.KEY_CONSTRAINTS
WHERE [TYPE] = 'PK' AND [PARENT_OBJECT_ID] = OBJECT_ID('USER.USER');

参考までに、Microsoftのドキュメントをここで確認してください。

于 2021-03-30T13:46:41.243 に答える
1

どうですか

USE information_schema;
SELECT 'TABLE_NAME' FROM 'TABLES' LEFT JOIN 'TABLE_CONSTRAINTS' USING('TABLE_SCHEMA', 'TABLE_NAME') WHERE 'TABLE_SCHEMA' = '__PUT_YOUR_DB_NAME_HERE__' AND 'CONSTRAINT_NAME' LIKE '%PRIMARY%' AND ISNULL('CONSTRAINT_CATALOG')
于 2012-11-06T19:59:18.273 に答える
0

私はショーンの答えが好きで、それは私のために働いた。句を追加できます

WHERE t.TABLE_TYPE = 'BASE TABLE'

EXCEPTビューを取り戻したくない場合は、ステートメントの直前。

;WITH tables_with_pk AS (
  SELECT t.table_schema, t.table_name
  FROM INFORMATION_SCHEMA.TABLES t 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
      ON t.TABLE_NAME = tc.TABLE_NAME AND t.table_schema = tc.table_schema
  WHERE tc.constraint_type = 'PRIMARY KEY' 
)
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t 
WHERE t.TABLE_TYPE = 'BASE TABLE'
EXCEPT
SELECT table_schema, table_name
FROM tables_with_pk
于 2016-11-01T00:06:55.063 に答える