sql >> Databasteknik >  >> RDS >> Sqlserver

3 sätt att returnera alla tabeller UTAN en primär nyckel i SQL Server

Om du någonsin behöver ta reda på om en databas har några tabeller som inte har en primärnyckel, kan du köra något av följande skript i SQL Server för att returnera just dessa tabeller.

Alla dessa skript drar fördel av OBJECTPROPERTY() fungera. Denna funktion accepterar en TableHasPrimaryKey argument som du kan kontrollera efter värdet 0 . Om det är 0 , tabellen har ingen primärnyckel. Om det är 1 det gör det. Därför kan du också använda den här funktionen för att returnera alla tabeller med en primärnyckel.

Dessa skript returnerar helt enkelt tabellens namn och dess schema, men du kan alltid ändra dem för att returnera fler kolumner.

Alternativ 1 – OBJECTPROPERTY() med sys.tables

sys.tables systemvy är förmodligen det mest självklara stället att börja. Denna vy returnerar en rad för varje användartabell, och när vi använder OBJECTPROPERTY() för att filtrera resultaten baserat på TableHasPrimaryKey egenskapen är 0 , får vi bara de tabellerna utan en primärnyckel.

ANVÄND Test;VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Tabell]FRÅN sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];

Resultat:

Ändrade databaskontext till 'Test'.+----------+--------------------------+| Schema | Tabell ||---------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individuell || dbo | Yrke || dbo | Team || dbo | TimeTest |+----------+---------------------+(7 rader påverkade)

I det här fallet är min nuvarande databas en testdatabas med ett gäng tabeller utan primärnycklar.

Om jag kör samma sats på en annan databas får jag inga resultat:

ANVÄND musik;VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Tabell]FRÅN sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];

Resultat:

Ändrade databaskontext till 'Musik'.(0 rader påverkade)

Alternativ 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES

Det här exemplet liknar det föregående, förutom att jag den här gången frågar efter INFORMATION_SCHEMA.TABLES se. Informationsschemavyerna som ingår i SQL Server överensstämmer med ISO-standarddefinitionen för INFORMATION_SCHEMA.

ANVÄND Test;VÄLJ TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =0 ANDTABLE_BYNAMN TABLE_TYPE='Tpre>ABLE_BYPE='TABLE_BYPE='TABLE_BYPE='TABLE_BYPE='TABLE_SCHEMA> 

Resultat:

Ändrade databaskontext till 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | TABLE_NAME ||----------------+------------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individuell || dbo | Yrke || dbo | Team || dbo | TimeTest |+----------------+----------------------------+(7 rader påverkade)

Alternativ 3 – OBJECTPROPERTY() med sys.objects

I det här exemplet frågar jag sys.objects se. Detta är en mer allmän vy jämfört med de två föregående, och den returnerar information om objekt med schemaomfattning (inte bara tabeller). På grund av detta måste vi filtrera resultaten med type = 'U' . U här står för användardefinierad tabell.

Återigen kan vi använda OBJECTPROPERTY() funktion för att filtrera resultaten till bara de tabeller som inte har en primärnyckel.

ANVÄND Test;VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Tabell]FRÅN sys.objects WHERE typ ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', namn)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table]

Resultat:

Ändrade databaskontext till 'Test'.+----------+--------------------------+| Schema | Tabell ||---------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individuell || dbo | Yrke || dbo | Team || dbo | TimeTest |+----------+---------------------+(7 rader påverkade)

Vi kan alternativt filtrera det efter type_desc = 'USER_TABLE' , vilket skulle ge samma resultat.

USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECT PROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table]

Resultat:

Ändrade databaskontext till 'Test'.+----------+--------------------------+| Schema | Tabell ||---------+---------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individuell || dbo | Yrke || dbo | Team || dbo | TimeTest |+----------+---------------------+(7 rader påverkade)

  1. Hur gör jag en bulkinfogning i mySQL med node.js

  2. Beställ efter COUNT per värde

  3. Konvertera månadsnummer till månadsnamnsfunktion i SQL

  4. Parallellism kommer till VAKUUM