Tentukan kunci utama tabel menggunakan TSQL

Saya ingin menentukan kunci utama suatu tabel menggunakan TSQL (prosedur tersimpan atau tabel sistem baik-baik saja). Apakah ada mekanisme seperti itu di SQL Server (2005 atau 2008)?


person rein    schedule 06.10.2009    source sumber


Jawaban (8)


Ini seharusnya membuatmu memulai:

SELECT 
    *
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
        ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE 
    tc.TABLE_NAME = 'TableName' AND 
    tc.CONSTRAINT_TYPE = 'Primary Key'
person Stuart Ainsworth    schedule 06.10.2009
comment
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA untuk beberapa skema - person Bohdan; 11.01.2021

Bagaimana tentang

sp_pkeys 'TableName'
person Jason Punyon    schedule 06.10.2009
comment
luar biasa! Saya melihat kinerja yang jauh lebih baik dari ini daripada dari penggabungan tabel melalui information_schema - person Mike M; 28.05.2015
comment
Ini akan lebih mudah jika itu adalah fungsi bernilai tabel yang dapat Anda pilih - person xr280xr; 08.08.2017
comment
Tidak dapat melakukan apa pun dengan hasilnya karena itu bukan fungsi. - person Peter Moore; 02.12.2019
comment
Jika Anda membutuhkan tabel, Anda bisa memasukkan hasil prosedur tersimpan ke dalam tabel. Pertama tentukan tabel declare @PrimaryKey table (TABLE_QUALIFIER nvarchar(100), TABLE_OWNER nvarchar(100), TABLE_NAME nvarchar(100), COLUMN_NAME nvarchar(100), KEY_SEQ int, PK_NAME nvarchar(100)) dan kemudian insert into @PrimaryKey exec sp_pkeys 'TABLE_NAME' - person Alexander Higgins; 02.12.2020

Ini yang berdasarkan tabel sistem dari SQL 2005 (99% yakin ini akan berfungsi pada tahun 2008). Ini akan mencantumkan semua PK untuk semua tabel yang ditentukan pengguna, dengan semua kolom dan beberapa bulu tambahan yang dapat dihapus. Tambahkan parameter untuk memilih tabel dalam satu waktu.

SELECT
   schema_name(ta.schema_id)  SchemaName
  ,ta.name  TableName
  ,ind.name
  ,indcol.key_ordinal Ord
  ,col.name  ColumnName
  ,ind.type_desc
  ,ind.fill_factor
 from sys.tables ta
  inner join sys.indexes ind
   on ind.object_id = ta.object_id
  inner join sys.index_columns indcol
   on indcol.object_id = ta.object_id
    and indcol.index_id = ind.index_id
  inner join sys.columns col
   on col.object_id = ta.object_id
    and col.column_id = indcol.column_id
 where ind.is_primary_key = 1
 order by
   ta.name
  ,indcol.key_ordinal
person Philip Kelley    schedule 06.10.2009

Lebih baik Anda menggunakan INFORMATION_SCHEMA.KEY_COLUMN_USAGE, karena Anda dapat mengakses informasi pemesanan kunci (ORDINAL_POSITION) yang sangat penting untuk diketahui.

SELECT 
    kcu.*
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
    INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        ON  tc.TABLE_NAME = kcu.TABLE_NAME AND 
            tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
ORDER BY 
    tc.TABLE_NAME,
    tc.CONSTRAINT_NAME,
    kcu.ORDINAL_POSITION
person sqlconsumer.net    schedule 12.10.2015

Cara paling sederhana adalah ini!

select object_id from sys.objects 
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
person JT Turner    schedule 10.12.2014
comment
Kode ini tidak mengembalikan kolom yang berisi kunci utama, coba kunci utama komposit. - person veljasije; 11.11.2015

Tidak dapat menambahkan komentar, poin rep tidak cukup, tetapi ini sebagai tanggapan terhadap mereka yang mengatakan sp_Pkeys tidak dapat digunakan. Tidak harus berupa fungsi seperti yang disebutkan dalam komentar lain untuk sebuah jawaban.

DECLARE @tbl TABLE
(
  Table_Qualifier varchar(30), 
  Table_Owner varchar(30), 
  Table_Name varchar(50), 
  Column_Name varchar(30), 
  Key_Seq int,
  PK_Name varchar(50)
)

insert into @tbl EXEC sp_Pkeys 'tablename'

select * from @tbl
person S Wagar    schedule 25.07.2020

Jika Anda sudah mengetahui nama kunci yang Anda minati, berikut ini berfungsi:

-- Assuming you have schema "Example" and the primary key name is "PK_Item"
-- Notice that name of table is irrelevant here but is "Foobar" here
IF (OBJECT_ID('Example.PK_ITEM') IS NULL)
BEGIN
    ALTER TABLE [Example].Foobar ADD CONSTRAINT
    PK_Item PRIMARY KEY ...
END
person Pasi Savolainen    schedule 18.04.2016
comment
Jika OP mencoba menemukan kunci utama suatu tabel, mengapa jawaban yang bergantung pada mengetahui kunci utama tabel itu berguna? - person GreySage; 16.07.2019
comment
Saya kira saya menafsirkan penentuan sebagai deteksi apakah itu ada - person Pasi Savolainen; 17.07.2019

person    schedule
comment
Ini jauh lebih baik daripada jawaban yang diterima, karena memberikan nama tabel. - person Uwe Keim; 16.10.2013
comment
Ini juga jauh lebih baik karena memiliki casing yang benar pada kolom dan PRIMARY KEY sehingga berfungsi pada server yang peka terhadap huruf besar-kecil! - person Ed Elliott; 12.11.2014