一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息

探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息

2019-12-30 15:47MYSQL教程網 Mysql

本篇文章是對SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息進行了詳細的分析介紹,需要的朋友參考下

接著上篇文章《解析SQL 表結構信息查詢 含主外鍵、自增長》里面提到了INFORMATION_SCHEMA視圖,其實到了SQL 2005微軟都主推大家使用INFORMATION_SCHEMA系統視圖,而不是在使用sys東東了,當然目前還是有許多信息只能通過sys視圖來查詢。這里我們還是以查詢表結果信息為例來說明一些主要的INFORMATION_SCHEMA視圖的使用。
首先我們需要查詢列的信息,這需要用到[INFORMATION_SCHEMA].[COLUMNS]系統視圖來查詢數據列的信息,SQL 如下:

復制代碼代碼如下:


SELECT  c.TABLE_SCHEMA ,
        c.TABLE_NAME ,
        c.COLUMN_NAME ,
        c.DATA_TYPE ,
        c.CHARACTER_MAXIMUM_LENGTH ,
        c.COLUMN_DEFAULT ,
        c.IS_NULLABLE ,
        c.NUMERIC_PRECISION ,
        c.NUMERIC_SCALE
FROM    [INFORMATION_SCHEMA].[COLUMNS] c
WHERE   TABLE_NAME = 'Address'


運行結果如下:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
我們都知道我們在定義列的時候一般的使用都是varchar(50)之類的信息,這里我們需要整合DATA_TYPE和CHARACTER_MAXIMUM_LENGTH信息,當CHARACTER_MAXIMUM_LENGTH為-1時即使說沒有指定具體最大長度,數據的指定長度信息是max,而numeric需要整合NUMERIC_PRECISION、NUMERIC_SCALE信息。修改后的SQL如下:

復制代碼代碼如下:


SELECT  c.TABLE_SCHEMA ,
        c.TABLE_NAME ,
        c.COLUMN_NAME ,
        CASE WHEN ( ( CHARINDEX('char', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH <> -1
                  )
             THEN c.DATA_TYPE + '('
                  + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ')'
             WHEN ( ( CHARINDEX('CHAR', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH = -1
                  ) THEN c.DATA_TYPE + '(max)'
             WHEN ( CHARINDEX('numeric', c.DATA_TYPE) > 0 )
             THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(4))
                  + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(4)) + ')'
             ELSE c.DATA_TYPE
        END AS DATA_TYPE ,
        c.COLUMN_DEFAULT ,
        c.IS_NULLABLE ,
        c.COLUMN_DEFAULT
FROM    [INFORMATION_SCHEMA].[COLUMNS] c
WHERE   TABLE_NAME = 'Address'
ORDER BY c.ORDINAL_POSITION


運行結果如圖:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息 
現在我們需要標記這張表的那些列是主鍵,那些列是外鍵,要查詢表的主、外鍵信息需要用到[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS]和[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] 系統視圖
運行結果如圖:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
修改我們先前的SQL語句:

復制代碼代碼如下:


SELECT  c.TABLE_SCHEMA ,
        c.TABLE_NAME ,
        c.COLUMN_NAME ,
        CASE WHEN ( ( CHARINDEX('char', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH <> -1
                  )
             THEN c.DATA_TYPE + '('
                  + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ')'
             WHEN ( ( CHARINDEX('CHAR', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH = -1
                  ) THEN c.DATA_TYPE + '(max)'
             WHEN ( CHARINDEX('numeric', c.DATA_TYPE) > 0 )
             THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(4))
                  + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(4)) + ')'
             ELSE c.DATA_TYPE
        END AS DATA_TYPE ,
        c.COLUMN_DEFAULT ,
        c.IS_NULLABLE ,
        c.COLUMN_DEFAULT ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 'YES'
             ELSE 'NO'
        END AS IS_PRIMARY_KEY ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 'YES'
             ELSE 'NO'
        END AS IS_FOREIGN_KEY
FROM    [INFORMATION_SCHEMA].[COLUMNS] c
        LEFT JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] kcu ON kcu.TABLE_SCHEMA = c.TABLE_SCHEMA
                                                              AND kcu.TABLE_NAME = c.TABLE_NAME
                                                              AND kcu.COLUMN_NAME = c.COLUMN_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] tc ON tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
                                                              AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE   c.TABLE_NAME = 'Address'
ORDER BY c.ORDINAL_POSITION


運行結果如圖:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
現在我們已經知道那些列是主鍵那些是外鍵,接下來的就是外鍵列所關聯的外檢表信息,這里需要用到[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS]系統視圖,運行該視圖如下:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
所以修改我們的SQL如下:

復制代碼代碼如下:


SELECT  c.TABLE_SCHEMA ,
        c.TABLE_NAME ,
        c.COLUMN_NAME ,
        CASE WHEN ( ( CHARINDEX('char', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH <> -1
                  )
             THEN c.DATA_TYPE + '('
                  + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ')'
             WHEN ( ( CHARINDEX('CHAR', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH = -1
                  ) THEN c.DATA_TYPE + '(max)'
             WHEN ( CHARINDEX('numeric', c.DATA_TYPE) > 0 )
             THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(4))
                  + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(4)) + ')'
             ELSE c.DATA_TYPE
        END AS DATA_TYPE ,
        c.COLUMN_DEFAULT ,
        c.IS_NULLABLE ,
        c.COLUMN_DEFAULT ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 'YES'
             ELSE 'NO'
        END AS IS_PRIMARY_KEY ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 'YES'
             ELSE 'NO'
        END AS IS_FOREIGN_KEY,
        fkcu.COLUMN_NAME AS FOREIGN_KEY,
        fkcu.TABLE_NAME AS FOREIGN_TABLE
FROM    [INFORMATION_SCHEMA].[COLUMNS] c
        LEFT JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] kcu ON kcu.TABLE_SCHEMA = c.TABLE_SCHEMA
                                                              AND kcu.TABLE_NAME = c.TABLE_NAME
                                                              AND kcu.COLUMN_NAME = c.COLUMN_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] tc ON tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
                                                              AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS] fc ON kcu.CONSTRAINT_SCHEMA = fc.CONSTRAINT_SCHEMA
                                                              AND kcu.CONSTRAINT_NAME = fc.CONSTRAINT_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] fkcu ON fkcu.CONSTRAINT_SCHEMA = fc.UNIQUE_CONSTRAINT_SCHEMA
                                                              AND fkcu.CONSTRAINT_NAME = fc.UNIQUE_CONSTRAINT_NAME
WHERE   c.TABLE_NAME = 'Address'
ORDER BY c.ORDINAL_POSITION


運行結果如圖:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
我們的查詢結果中顯示了太多的NULL,看著不怎么舒服,還有我們的表名應該顯示一次就可以,修改SQL如下:

復制代碼代碼如下:


SELECT  CASE WHEN c.ORDINAL_POSITION = 1
             THEN c.TABLE_SCHEMA + '.' + c.TABLE_NAME
             ELSE ''
        END AS TABLE_NAME ,
        c.COLUMN_NAME ,
        CASE WHEN ( ( CHARINDEX('char', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH <> -1
                  )
             THEN c.DATA_TYPE + '('
                  + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ')'
             WHEN ( ( CHARINDEX('CHAR', c.DATA_TYPE) > 0
                      OR CHARINDEX('binary', c.DATA_TYPE) > 0
                    )
                    AND c.CHARACTER_MAXIMUM_LENGTH = -1
                  ) THEN c.DATA_TYPE + '(max)'
             WHEN ( CHARINDEX('numeric', c.DATA_TYPE) > 0 )
             THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(4))
                  + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(4)) + ')'
             ELSE c.DATA_TYPE
        END AS DATA_TYPE ,
        ISNULL(c.COLUMN_DEFAULT, '') AS COLUMN_DEFAULT ,
        CASE WHEN c.IS_NULLABLE = 'YES' THEN '√'
             ELSE ''
        END IS_NULLABLE ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN '√'
             ELSE ''
        END AS IS_PRIMARY_KEY ,
        CASE WHEN tc.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN '√'
             ELSE ''
        END AS IS_FOREIGN_KEY ,
        ISNULL(fkcu.COLUMN_NAME, '') AS FOREIGN_KEY ,
        ISNULL(fkcu.TABLE_NAME, '') AS FOREIGN_TABLE
FROM    [INFORMATION_SCHEMA].[COLUMNS] c
        LEFT JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] kcu ON kcu.TABLE_SCHEMA = c.TABLE_SCHEMA
                                                              AND kcu.TABLE_NAME = c.TABLE_NAME
                                                              AND kcu.COLUMN_NAME = c.COLUMN_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] tc ON tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
                                                              AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS] fc ON kcu.CONSTRAINT_SCHEMA = fc.CONSTRAINT_SCHEMA
                                                              AND kcu.CONSTRAINT_NAME = fc.CONSTRAINT_NAME
        LEFT JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] fkcu ON fkcu.CONSTRAINT_SCHEMA = fc.UNIQUE_CONSTRAINT_SCHEMA
                                                              AND fkcu.CONSTRAINT_NAME = fc.UNIQUE_CONSTRAINT_NAME
WHERE   c.TABLE_NAME = 'Address'
ORDER BY c.ORDINAL_POSITION



運行結果如圖:
探討SQL利用INFORMATION_SCHEMA系統視圖如何獲取表的主外鍵信息
有不對的地方還請大家拍磚!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品无人区一区二区三区 | 久久视频这有精品63在线国产 | 青草青青在线视频观看 | 隔壁的漂亮邻居hd中文 | 手机看片福利盒子久久 | 久久亚洲高清观看 | 精品欧美男同同性videos | 9久re热视频这里只有精品 | 色先锋影音资源 | 亚洲国产影院 | 国模大胆一区二区三区 | 欧美综合色网 | japanese在线观看 | 农村妇女野战bbxxx农村妇女 | 91免费精品国自产拍在线可以看 | 国产亚洲综合久久 | 动漫女性扒开尿口羞羞漫画 | 国产18在线 | 日本不卡视频免费的 | 国产一区二区三区四区波多野结衣 | 精品日产1区2卡三卡麻豆 | 国产成人 免费观看 | 日韩欧美一区黑人vs日本人 | 嫩草在线视频www免费观看 | 鄂州一家三口完整版免费 | 国产青草视频在线观看免费影院 | 国产卡一卡二卡3卡乱码免费 | 视频高h | heyzo在线观看 | 美日毛片| 免费永久观看美女视频网站网址 | 99re最新网址| 国产清纯91天堂在线观看 | 古装床戏做爰无遮挡三级 | 精品手机在线1卡二卡3卡四卡 | 波多野 在线 | 亚洲AV午夜精品麻豆AV | 日韩亚洲欧美一区二区三区 | 国产小嫩模好紧 | 男人看的网址 | 国产免费丝袜调教视频 |