คำถามถูกติดแท็ก SQL Server 2000 แต่เพื่อประโยชน์ของผู้ที่กำลังพัฒนาในเวอร์ชั่นล่าสุดฉันจะพูดถึงเรื่องนี้ก่อน
SQL Server 2014
นอกเหนือจากวิธีการเพิ่มดัชนีตามข้อ จำกัด ที่กล่าวถึงด้านล่าง SQL Server 2014 ยังอนุญาตให้ระบุดัชนีที่ไม่ซ้ำกันโดยตรงด้วยไวยากรณ์แบบอินไลน์ในการประกาศตัวแปรตาราง
ตัวอย่างไวยากรณ์สำหรับที่อยู่ด้านล่าง
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
ดัชนีและดัชนีที่กรองพร้อมคอลัมน์ที่รวมอยู่ในขณะนี้ไม่สามารถประกาศด้วยไวยากรณ์นี้ได้ในขณะนี้ แต่SQL Server 2016จะช่วยให้ผ่อนคลายได้อีกเล็กน้อย จาก CTP 3.1 เป็นไปได้ที่จะประกาศดัชนีตัวกรองสำหรับตัวแปรตาราง โดย RTM อาจเป็นกรณีที่อนุญาตให้มีคอลัมน์ที่รวมอยู่ด้วย แต่ตำแหน่งปัจจุบันคือพวกเขา"จะไม่ทำให้เป็น SQL16 เนื่องจากข้อ จำกัด ของทรัพยากร"
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL Server 2000 - 2012
ฉันสามารถสร้างดัชนีในชื่อได้หรือไม่
คำตอบสั้น ๆ : ใช่
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
คำตอบโดยละเอียดเพิ่มเติมอยู่ด้านล่าง
ตารางแบบดั้งเดิมใน SQL Server สามารถมีดัชนีคลัสเตอร์หรือมีโครงสร้างเป็นกอง
ดัชนีแบบกลุ่มสามารถถูกประกาศให้เป็นค่าที่ไม่ซ้ำกันเพื่อไม่อนุญาตให้ใช้ค่าคีย์ที่ซ้ำกันหรือค่าดีฟอลต์เป็นแบบไม่ซ้ำกัน หากไม่ซ้ำกันแล้ว SQL Server จะเพิ่มตัวระบุที่ไม่ซ้ำกันไปยังคีย์ที่ซ้ำกันเพื่อทำให้เป็นเอกลักษณ์
ดัชนีที่ไม่ใช่คลัสเตอร์ยังสามารถประกาศอย่างชัดเจนว่าไม่ซ้ำกัน มิฉะนั้นสำหรับกรณีที่ไม่ซ้ำกัน SQL Server จะเพิ่มตัวระบุแถว (คีย์ดัชนีคลัสเตอร์หรือRIDสำหรับฮีป) ให้กับคีย์ดัชนีทั้งหมด (ไม่เพียง แต่ซ้ำกัน) สิ่งนี้ทำให้แน่ใจได้ว่าพวกเขาจะไม่ซ้ำกัน
ใน SQL Server 2000 - 2012 ดัชนีบนตัวแปรตารางสามารถสร้างได้โดยปริยายโดยการสร้าง UNIQUE
หรือPRIMARY KEY
ข้อ จำกัด ความแตกต่างระหว่างประเภทข้อ จำกัด เหล่านี้คือคีย์หลักต้องอยู่ในคอลัมน์ที่ไม่สามารถลบล้างได้ คอลัมน์ที่เข้าร่วมในข้อ จำกัด ที่ไม่ซ้ำกันอาจเป็นโมฆะ (แม้ว่า SQL Server จะมีข้อ จำกัด ที่ไม่ซ้ำกันในการปรากฏตัวของNULL
s ไม่ได้เป็นไปตามที่ระบุไว้ใน SQL Standard) นอกจากนี้ตารางสามารถมีคีย์หลักได้เพียงคีย์เดียว แต่มีข้อ จำกัด ที่ไม่ซ้ำกันหลายข้อ
ข้อ จำกัด เชิงตรรกะทั้งสองนี้มีการใช้งานทางกายภาพด้วยดัชนีที่ไม่ซ้ำกัน หากไม่ได้ระบุไว้อย่างชัดเจนมิฉะนั้นPRIMARY KEY
จะกลายเป็นดัชนีที่เป็นคลัสเตอร์และข้อ จำกัด ที่ไม่ซ้ำกันซึ่งไม่ได้ทำคลัสเตอร์ แต่พฤติกรรมนี้สามารถถูกแทนที่ได้ด้วยการระบุCLUSTERED
หรือNONCLUSTERED
ชัดเจนด้วยการประกาศข้อ จำกัด
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
อันเป็นผลมาจากดัชนีข้างต้นสามารถสร้างขึ้นโดยปริยายบนตัวแปรตารางใน SQL Server 2000 - 2012
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
อันสุดท้ายต้องใช้คำอธิบายเล็กน้อย ในคำนิยามตัวแปรตารางที่จุดเริ่มต้นของคำตอบนี้ดัชนีที่ไม่ใช่แบบคลัสเตอร์ที่ไม่ซ้ำกันName
จะถูกจำลองโดยดัชนีเฉพาะบนName,Id
(จำได้ว่า SQL Server จะเพิ่มคีย์ดัชนีแบบคลัสเตอร์ในคีย์ NCI ที่ไม่ซ้ำกันอยู่แล้ว)
ดัชนีคลัสเตอร์ที่ไม่ซ้ำกันสามารถทำได้โดยการเพิ่มIDENTITY
คอลัมน์เพื่อทำหน้าที่เป็นตัวระบุ
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
แต่นี่ไม่ใช่การจำลองที่แม่นยำของวิธีการที่ดัชนีที่ไม่ซ้ำแบบคลัสเตอร์จะนำไปใช้งานจริงใน SQL Server ตามจริงซึ่งเป็นการเพิ่ม "Uniqueifier" ให้กับแถวทั้งหมด ไม่ใช่แค่คนที่ต้องการมัน