0

データベース内のテーブルと、各テーブルの主キー フィールドを返す次の SQL コードがあります。

SELECT Keys.TABLE_NAME As 'Table Name',
Keys.COLUMN_NAME AS 'Primary Key'
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS Constraints
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS Keys
ON Constraints.TABLE_NAME = Keys.TABLE_NAME
AND Constraints.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME
WHERE Constraints.CONSTRAINT_TYPE = 'PRIMARY KEY'

そのままでは、主キーを持つテーブルのみが表示されます。すべてのテーブルを表示するように SQL を変更するにはどうすればよいですか。主キーを持たないテーブルでは、代わりに「主キー」列に「null」が表示されますか?

4

2 に答える 2

1

これを行うには、すべてのテーブルのリストから始めて、左外部結合を使用してテーブルを結合する必要があります。

SELECT t.TABLE_NAME As 'Table Name',
       Keys.COLUMN_NAME AS 'Primary Key'
FROM INFORMATION_SCHEMA.TABLES t left outer join
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS Constraints
     on t.TABLE_NAME = Constraints.Table_name and
        t.Table_Schema = Constraints.Table_Schema left outer join
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS Keys 
     ON Constraints.TABLE_NAME = Keys.TABLE_NAME and
        Constraints.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME and
        Constraints.CONSTRAINT_TYPE = 'PRIMARY KEY'
于 2012-09-10T17:44:47.983 に答える
1

デフォルトでは、「結合」は内部結合であり、結合条件に基づいて他のテーブルに対応する行がある場合にのみ行を表示します。したがって、ここではストレート結合を使用したくないでしょう。テーブルが一致しない行を返すことを許可する、左結合、右結合、または完全結合のいずれかが必要です。

ただし、table_constraints には制約のあるもののみがリストされ、where 制約は主キーを持たない行を除外するため、ここでは左結合に切り替えることはできません。

したがって、すべてのテーブルを含めるために information_schema.tables を取り込み、主キー条件を where 句ではなく結合条件に移動できます。次のようになります。

SELECT t.TABLE_NAME As 'Table Name',  
Keys.COLUMN_NAME AS 'Primary Key'  
FROM 
INFORMATION_SCHEMA.TABLES as t
left join 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS Constraints  
on t.TABLE_NAME = constraints.TABLE_NAME and t.TABLE_SCHEMA = constraints.TABLE_SCHEMA
left JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS Keys  
ON Constraints.TABLE_NAME = Keys.TABLE_NAME  
AND Constraints.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME  
and Constraints.CONSTRAINT_TYPE = 'PRIMARY KEY' 
于 2012-09-10T17:46:59.793 に答える