webForumDet fria alternativet

SQL för att få fram om det finns primärnyckel

Databaser & SQL

10 svar · 282 visningar · startad av kristoffer

Medlem sedan juni 20001 257 inlägg
Frågan#1

Vad skriver jag för att få fram egenskaperna för en tabell? Jag behöver bla veta om och isf vilken kolumn som är primärnyckel.

Medlem sedan dec. 200012 464 inlägg
#2
select kcu.* 
from information_schema.key_column_usage kcu
inner join information_schema.table_constraints tc
on tc.constraints_catalog = kcu.constraints_catalog
and tc.constraints_schema = kcu.constraints_schema
and tc.constraints_name = kcu.constraints_name
where constraint_type = 'PRIMARY KEY'
and table_catalog = 'din katalog'
and table_schema = 'ditt schema'
and table_name = 'ditt namn'
Medlem sedan juni 20001 257 inlägg
#3

Hm. Funkade inte för mig. Men jag kör den här fete jäveln som fungerar:

SELECT (SELECT COLUMNPROPERTY(OBJECT_ID('Subscriber_sub'), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME
				, 'IsIdentity')) AS IsIdentity,(ISNULL((SELECT TOP 1 CASE INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE
				 WHEN 'PRIMARY KEY' THEN 1	END	FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS
				 ON INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME
				 WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = 'Subscriber_sub' AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =
				 INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'PRIMARY KEY'
				), 0)) AS IsPrimaryKey,(ISNULL((SELECT TOP 1 CASE INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE WHEN 'FOREIGN KEY' THEN 1
				 END FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON
				 INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME
				 WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = 'Subscriber_sub' AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =
				 INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
				), 0)) AS IsForeignKey, (ISNULL((SELECT TOP 1 CASE INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE WHEN 'UNIQUE' THEN 1
				 END FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ON
				 INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME=INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME WHERE
				 INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME = 'Subscriber_sub' AND INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME =
				 INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'UNIQUE'
				), 0)) AS HasUniqueConstraint FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Subscriber_sub'

Då får jag reda på att inga av fälten är primärnyckel. Det är konstigt, för tittar jag i valfritt GUI ser jag att det finns en liten nyckel på en av kolumnerna. Om jag genererar ett CREATE-skript för tabellen får jag följande:

if exists (select * from sysobjects where id = object_id(N'[dbo].[Subscriber_sub]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Subscriber_sub]
GO

CREATE TABLE [dbo].[Subscriber_sub] (
	[Id] [int] IDENTITY (1, 1) NOT NULL ,
	[Email] [varchar] (255) NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Subscriber_sub] WITH NOCHECK ADD 
	CONSTRAINT [PK_Subscriber_sub] PRIMARY KEY  NONCLUSTERED 
	(
		[Id]
	) WITH  FILLFACTOR = 90  ON [PRIMARY] 
GO

Kan man se på det generade scriptet vad som är fel med primärnyckeln? Är det ett index och inte en primärnyckel eller vad är det egentligen?

Medlem sedan dec. 200012 464 inlägg
#4

Vad var det för problem med min fråga?

Medlem sedan juni 20001 257 inlägg
#5
SELECT kcu.*
FROM information_schema.key_column_usage kcu INNER JOIN
    information_schema.table_constraints tc ON 
    tc.constraints_catalog = kcu.constraints_catalog AND 
    tc.constraints_schema = kcu.constraints_schema AND 
    tc.constraints_name = kcu.constraints_name
WHERE constraint_type = 'PRIMARY KEY' AND 
    table_catalog = 'tavlingar' AND 
    table_schema = 'dbo' AND table_name = 'Subscriber_sub'

Ger följande fel:

Invalid column name 'constraints_catalog'
Invalid column name 'constraints_catalog'
Invalid column name 'constraints_name'
Invalid column name 'constraints_name'
Invalid column name 'constraints_schema'
Invalid column name 'constraints_schema'
Ambiguous column name 'table_name'
Ambiguous column name 'table_schema'
Ambiguous column name 'table_catalog'

Då ändrar jag till

SELECT kcu.*
FROM information_schema.key_column_usage kcu INNER JOIN
    information_schema.table_constraints tc ON 
    tc.constraints_catalog = kcu.constraints_catalog AND 
    tc.constraints_schema = kcu.constraints_schema AND 
    tc.constraints_name = kcu.constraints_name
WHERE constraint_type = 'PRIMARY KEY' AND 
    tc.table_catalog = 'tavlingar' AND tc.table_schema = 'dbo' AND 
    tc.table_name = 'Subscriber_sub'

och får då bara felen

Invalid column name 'constraints_catalog'
Invalid column name 'constraints_catalog'
Invalid column name 'constraints_name'
Invalid column name 'constraints_name'
Invalid column name 'constraints_schema'
Invalid column name 'constraints_schema'

Men fungerar alltså fortfarande inte.

Medlem sedan dec. 200012 464 inlägg
#6

Så då

SELECT kcu.*
FROM information_schema.key_column_usage kcu INNER JOIN
    information_schema.table_constraints tc ON 
    tc.constraint_catalog = kcu.constraint_catalog AND 
    tc.constraint_schema = kcu.constraint_schema AND 
    tc.constraint_name = kcu.constraint_name
WHERE constraint_type = 'PRIMARY KEY' AND 
    kcu.table_catalog = 'tavlingar' AND 
    kcu.table_schema = 'dbo' AND 
    kcu.table_name = 'Subscriber_sub'
Medlem sedan juni 20001 257 inlägg
#7

Det fungerade. Jag får:

CONSTRAINT_CATALOG
tavlingar

CONSTRAINT_SCHEMA
dbo

CONSTRAINT_NAME
PK_Subscriber_sub

TABLE_CATALOG
tavlingar

TABLE_SCHEMA
dbo

TABLE_NAME
Subscriber_sub

COLUMN_NAME
Id

ORDINAL_POSITION
1

Det ser ju ut som Id är primärnyckel. Men jag upplever att den inte är det ändå.

Medlem sedan dec. 200012 464 inlägg
#8

Nu förstår jag inte riktigt. Allt indikerar att ID är primärnyckel. Varför tvekar du?

Medlem sedan juni 20001 257 inlägg
#9

Se den här tråden.

Medlem sedan dec. 200012 464 inlägg
#10

Det verkar ju lite konstrgt. Kör du som samma användare i alla miljöerna?

Medlem sedan juni 20001 257 inlägg
#11

Nej det gjorde jag tydligen inte. Nu funkar det!

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)