---
title: "SQL för att få fram om det finns primärnyckel"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/71517-sql-för-att-få-fram-om-det-finns-primärnyckel"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "kristoffer"
published: "2003-03-18T20:55:45.000Z"
updated: "2003-04-10T23:51:14.000Z"
replies: 10
views: 301
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/71517-sql-för-att-få-fram-om-det-finns-primärnyckel"
---

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

## #1 — kristoffer, 2003-03-18T20:55Z

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.

Permalänk: https://www.webforum.nu/p/71517

## #2 — LarsG, 2003-03-18T21:07Z

```
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'
```

Permalänk: https://www.webforum.nu/p/983420

## #3 — kristoffer, 2003-03-18T21:45Z

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?

Permalänk: https://www.webforum.nu/p/983447

## #4 — LarsG, 2003-03-18T22:06Z

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

Permalänk: https://www.webforum.nu/p/983457

## #5 — kristoffer, 2003-03-18T22:13Z

```
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.

Permalänk: https://www.webforum.nu/p/983462

## #6 — LarsG, 2003-03-18T22:34Z

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'
```

Permalänk: https://www.webforum.nu/p/983480

## #7 — kristoffer, 2003-03-18T22:43Z

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å.

Permalänk: https://www.webforum.nu/p/983483

## #8 — LarsG, 2003-03-18T22:50Z

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

Permalänk: https://www.webforum.nu/p/983490

## #9 — kristoffer, 2003-03-22T00:12Z

Se den [här](http://www.webforum.nu/showthread.php?s=&threadid=70282) tråden.

Permalänk: https://www.webforum.nu/p/985480

## #10 — LarsG, 2003-03-23T19:21Z

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

Permalänk: https://www.webforum.nu/p/986476

## #11 — kristoffer, 2003-04-10T23:51Z

Nej det gjorde jag tydligen inte. Nu funkar det!

Permalänk: https://www.webforum.nu/p/1008085

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/71517-sql-för-att-få-fram-om-det-finns-primärnyckel
