sql >> Databáze >  >> RDS >> Sqlserver

3 způsoby, jak vrátit všechny tabulky BEZ primárního klíče na SQL Server

Pokud budete někdy potřebovat zjistit, zda databáze obsahuje nějaké tabulky, které nemají primární klíč, můžete v SQL Serveru spustit kterýkoli z následujících skriptů a vrátit pouze tyto tabulky.

Všechny tyto skripty využívají OBJECTPROPERTY() funkce. Tato funkce přijímá TableHasPrimaryKey argument, že můžete zkontrolovat hodnotu 0 . Pokud je to 0 , tabulka nemá primární klíč. Pokud je to 1 to dělá. Proto můžete také použít tuto funkci k vrácení všech tabulek s primární klíč.

Tyto skripty jednoduše vrátí název tabulky a její schéma, ale vždy je můžete upravit tak, aby vrátily více sloupců.

Možnost 1 – OBJECTPROPERTY() se sys.tables

Soubor sys.tables systémový pohled je pravděpodobně tím nejviditelnějším místem, kde začít. Toto zobrazení vrátí řádek pro každou uživatelskou tabulku, a když použijeme OBJECTPROPERTY() filtrovat výsledky na základě TableHasPrimaryKey vlastnost je 0 , dostaneme pouze ty tabulky bez primárního klíče.

USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], name AS [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabulka];

Výsledek:

Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)

V tomto případě je moje aktuální databáze testovací databáze s hromadou tabulek bez primárních klíčů.

Pokud spustím stejný příkaz v jiné databázi, nedostanu žádné výsledky:

USE Music;SELECT SCHEMA_NAME(schema_id) AS [Schéma], název AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka];

Výsledek:

Kontext databáze byl změněn na 'Hudba'. (0 ovlivněných řádků)

Možnost 2 – OBJECTPROPERTY() s INFORMATION_SCHEMA.TABLES

Tento příklad je podobný předchozímu, ale tentokrát se ptám na INFORMATION_SCHEMA.TABLES Pohled. Zobrazení informačního schématu zahrnutá v SQL Serveru vyhovují definici normy ISO pro INFORMATION_SCHEMA.

USE Test;SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasPrimaryKey') =0 ANDTABLE_TYPE='ORTABASE_MABLE_NAME> 

Výsledek:

Kontext databáze byl změněn na „Test“.+----------------+--------------------+ | TABLE_SCHÉMA | TABLE_NAME ||----------------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------------+--------------------+ (dotčených 7 řádků)

Možnost 3 – OBJECTPROPERTY() se sys.objects

V tomto příkladu se dotazuji na sys.objects Pohled. Toto je obecnější pohled ve srovnání s předchozími dvěma a vrací informace o objektech s rozsahem schématu (nejen tabulkách). Z tohoto důvodu musíme výsledky filtrovat pomocí type = 'U' . U zde znamená uživatelsky definovanou tabulku.

Opět můžeme použít OBJECTPROPERTY() filtrovat výsledky pouze na ty tabulky, které nemají primární klíč.

USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], název JAKO [Tabulka]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(NÁZEV_SCHÉMAU(id_schema), '.', název)) , 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka]

Výsledek:

Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)

Alternativně bychom to mohli filtrovat podle type_desc = 'USER_TABLE' , což by přineslo stejný výsledek.

USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], name AS [Tabulka]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(NAME_SCHEMA(id_schema), '.', název)) , 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka]

Výsledek:

Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)

  1. Mapujte bodové pole geometrie PostGIS pomocí Hibernate na Spring Boot

  2. Získat nové ID primárního klíče záznamu z dotazu na vložení MySQL?

  3. Jak zjistit dotaz, který drží zámek v Postgres?

  4. Jak mohu napsat SQL pro tabulku, která sdílí stejný název jako chráněné klíčové slovo v MySql?