กำหนดคีย์หลักของตารางโดยใช้ TSQL

ฉันต้องการกำหนดคีย์หลักของตารางโดยใช้ TSQL (ขั้นตอนการจัดเก็บหรือตารางระบบก็ใช้ได้) มีกลไกดังกล่าวใน SQL Server (2005 หรือ 2008) หรือไม่


person rein    schedule 06.10.2009    source แหล่งที่มา


คำตอบ (8)


สิ่งนี้ควรช่วยให้คุณเริ่มต้นได้:

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 สำหรับหลายสคีมา - person Bohdan; 11.01.2021

เกี่ยวกับ

sp_pkeys 'TableName'
person Jason Punyon    schedule 06.10.2009
comment
ตัวเอก! ฉันเห็นประสิทธิภาพที่ดีขึ้นมากจากสิ่งนี้มากกว่าจากการรวมตารางผ่าน information_schema - person Mike M; 28.05.2015
comment
นี่จะสะดวกกว่ามากหากเป็นฟังก์ชันที่มีค่าของตารางที่คุณสามารถเลือกได้ - person xr280xr; 08.08.2017
comment
ไม่สามารถทำอะไรกับผลลัพธ์ได้เพราะว่ามันไม่ใช่ฟังก์ชัน - person Peter Moore; 02.12.2019
comment
หากคุณต้องการตาราง คุณสามารถแทรกผลลัพธ์ของกระบวนงานที่เก็บไว้ลงในตารางได้ ขั้นแรกให้กำหนดตาราง 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)) จากนั้น insert into @PrimaryKey exec sp_pkeys 'TABLE_NAME' - person Alexander Higgins; 02.12.2020

นี่คือตารางระบบจาก SQL 2005 (99% แน่ใจว่าจะใช้งานได้ในปี 2008) นี่จะแสดงรายการ PK ทั้งหมดสำหรับตารางที่ผู้ใช้กำหนดทั้งหมด พร้อมด้วยคอลัมน์ทั้งหมดและขนปุยพิเศษบางส่วนที่สามารถลบออกได้ เพิ่มพารามิเตอร์เพื่อเลือกตารางในแต่ละครั้ง

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

คุณควรใช้ INFORMATION_SCHEMA.KEY_COLUMN_USAGE จะดีกว่า เนื่องจากคุณสามารถเข้าถึงข้อมูลการสั่งซื้อคีย์ (ORDINAL_POSITION) ซึ่งเป็นสิ่งสำคัญมากที่ต้องทราบ

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

วิธีที่ง่ายที่สุดคือสิ่งนี้!

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
รหัสนี้ไม่ส่งคืนคอลัมน์ที่มีคีย์หลัก โปรดลองใช้คีย์หลักแบบผสม - person veljasije; 11.11.2015

ไม่สามารถเพิ่มความคิดเห็นได้ คะแนนตัวแทนไม่เพียงพอ แต่นี่เป็นการตอบสนองต่อผู้ที่บอกว่า sp_Pkeys ใช้ไม่ได้ ไม่จำเป็นต้องเป็นฟังก์ชั่นตามที่กล่าวไว้ในความคิดเห็นอื่นเพื่อตอบ

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

หากคุณทราบชื่อคีย์ที่คุณสนใจแล้ว ให้ดำเนินการดังนี้:

-- 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
หาก OP พยายามค้นหาคีย์หลักของตาราง เหตุใดคำตอบที่ต้องอาศัยการรู้คีย์หลักของตารางจึงมีประโยชน์ - person GreySage; 16.07.2019
comment
ฉันเดาว่าฉันตีความการตรวจสอบว่าตรวจพบว่ามีอยู่หรือไม่ - person Pasi Savolainen; 17.07.2019

person    schedule
comment
นี่เป็น ทาง ดีกว่าคำตอบที่ยอมรับ เนื่องจากจะให้ชื่อตาราง - person Uwe Keim; 16.10.2013
comment
นอกจากนี้ยังดีกว่ามากเนื่องจากมีตัวพิมพ์ที่ถูกต้องบนคอลัมน์และคีย์หลัก ดังนั้นจึงทำงานบนเซิร์ฟเวอร์ที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่! - person Ed Elliott; 12.11.2014