เพิ่มคีย์หลักอัตโนมัติใน SQL Server Management Studio 2012


447

ฉันจะในตารางฐานข้อมูลที่ผมเคยได้ดูผ่านฟอรั่ม แต่ไม่สามารถดูวิธีการauto incrementprimary keySQL Server

ฉันดูคุณสมบัติ แต่ไม่เห็นตัวเลือกฉันเห็นคำตอบว่าคุณไปที่Identityคุณสมบัติข้อมูลจำเพาะและตั้งค่าเป็นใช่และตั้งค่าเป็นIdentity increment1 แต่ส่วนนั้นเป็นสีเทาและไม่สามารถเปลี่ยนได้ ไม่ใช่เพื่อใช่

ต้องมีวิธีที่ง่ายในการทำเช่นนี้ แต่ฉันหามันไม่เจอ


5
ประเภทข้อมูลของคอลัมน์คีย์เป็น int หรือไม่
Raab

1
@CoDe aDDict ชุดปัจจุบันของมันเป็นถ่าน (10) แต่ฉันสามารถเปลี่ยนได้ในขณะที่ฉันเพิ่งฝึกซ้อมขอบคุณ
Ledgemonkey

คำตอบ:


704

ตรวจสอบให้แน่ใจว่าประเภทข้อมูลของคอลัมน์คีย์intนั้นตั้งค่าตัวตนด้วยตนเองตามที่ภาพแสดง

ป้อนคำอธิบายรูปภาพที่นี่

หรือ เพียงแค่เรียกใช้รหัสนี้

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

รหัสจะทำงานหากIDไม่ใช่คอลัมน์เดียวในตาราง

ภาพอ้างอิงของ Fifo


21
เพียงเล็กน้อยของการแก้ไขที่: IDENTITYสถานที่ให้บริการสามารถนำไปใช้ชนิดข้อมูลใด ๆ ที่เป็นตัวเลข (ดังนั้นมันอาจจะเป็นtinyint, smallint, int, bigint, numeric, decimal) ข้อ จำกัด เพียงอย่างเดียวคือว่ามันไม่สามารถแทนจำนวนเศษส่วน (ดังนั้นจึงไม่สามารถ floatหรือrealไม่numericหรือdecimal ด้วยขนาดที่ไม่เป็นศูนย์ ) และ ofc ข้อมูลจำเพาะตัวตนควรเข้ากันได้กับชนิดข้อมูลที่เลือก
Pred

2
งานให้โดยไม่มีกุญแจต่างประเทศและอื่น ๆ
วันแอนดรูว์วันที่

3
ฉันต้องการเพิ่มถ้าคุณได้ตั้งค่าเริ่มต้นในคอลัมน์ข้อมูลประจำตัวของคุณแล้ว (Is Identity) จะยังคงเป็นสีเทา ลบค่าเริ่มต้นและจะสามารถใช้ได้อีกครั้ง
CDspace

7
หากคุณไม่สามารถแก้ไขค่าได้ให้ไปที่ Tools-Options-Designers และยกเลิกการเลือกตัวเลือก "ป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างใหม่"
Jaume

185

เมื่อคุณสร้างตารางคุณสามารถสร้างIDENTITYคอลัมน์ได้ดังนี้:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITYประสงค์คุณสมบัติอัตโนมัติเพิ่มคอลัมน์ขึ้นจากหมายเลข 1 (หมายเหตุว่าชนิดข้อมูลของคอลัมน์จะต้องมีจำนวนเต็ม.) หากคุณต้องการที่จะเพิ่มไปยังคอลัมน์ที่มีอยู่ให้ใช้ALTER TABLEคำสั่ง

แก้ไข:
ทดสอบแล้วและฉันไม่สามารถหาวิธีการเปลี่ยนคุณสมบัติผู้ใช้อีเมลผ่านหน้าต่างคุณสมบัติคอลัมน์สำหรับตารางต่างๆ ฉันเดาว่าคุณต้องการให้คอลัมน์เป็นคอลัมน์ข้อมูลประจำตัวคุณต้องใช้ALTER TABLEคำสั่ง


อ่านี่สำหรับ SQL Server 2008 r2 โดยเฉพาะ - ไม่เป็นไร
Josien

2
สร้างตารางไวยากรณ์นี้เป็นวิธีปฏิบัติที่ดีตามคำแนะนำโดยผู้เขียน โพสต์นี้ในความคิดเห็นหวังว่าจะช่วยให้ใครบางคน
shaijut

88

คุณต้องขยายส่วนของข้อมูลประจำตัวเพื่อแสดงการเพิ่มและการเพาะ

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: ฉันคิดว่าคุณมีประเภทข้อมูลจำนวนเต็มไม่ใช่อักขระ (10) มีเหตุผลใดที่ฉันจะพูดและใช้ได้เมื่อฉันโพสต์คำตอบนี้


2
yesเป็นสีเทาออกมามันคือchar(10)(จากความคิดเห็นที่โพสต์แค่)
มาร์ตินสมิ ธ

@ มาร์ตินสมิ ธ ใช่ว่าดูเหมือนจะเป็นปัญหาทั่วไปฉันจะเปลี่ยนสิ่งนี้และทดสอบขอบคุณมาก
Ledgemonkey

ในขณะที่สร้างตารางใหม่ที่ฉันใช้BookID int primary key identityฉันไม่ได้ระบุทั้งเมล็ดและการเพิ่มขึ้นนั่นเป็นแนวทางปฏิบัติที่ดีใช่หรือไม่ ทำให้ฉันเห็นเอกสารในMSDNหากไม่ได้ระบุไว้ค่าเริ่มต้นคือ (1,1)
shaijut

40

ขยายฐานข้อมูลขยายตารางของคุณคลิกขวาบนตารางของคุณและเลือกการออกแบบจากดรอปดาวน์ ดูเหมือนว่าจะเป็นแบบนี้

ตอนนี้ไปที่คุณสมบัติของคอลัมน์ด้านล่างของมันเลื่อนลงและค้นหาข้อมูลจำเพาะของผู้ใช้ขยายตัวแล้วคุณจะพบว่าIs Identityทำให้ใช่ ตอนนี้เลือกการเพิ่มเอกลักษณ์ด้านล่างของมันให้ค่าที่คุณต้องการเพิ่มในนั้น ป้อนคำอธิบายรูปภาพที่นี่


1
ดูเหมือนว่ามันจะเป็นคำตอบที่ถูกต้องสำหรับฉันแค่ทำให้ชนิดข้อมูลเป็น int จะไม่ทำเคล็ดลับใช่มั้ย
Drewdin

10

บางทีฉันหายไปบางอย่าง แต่ทำไมไม่ทำงานกับวัตถุ SEQUENCE นี่ไม่ใช่สิ่งที่คุณกำลังมองหาใช่ไหม

ตัวอย่าง:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

เมื่ออ้างถึง squence ในการพูดคำสั่ง INSERT เพียงใช้:

NEXT VALUE FOR blah.blahsequence

ข้อมูลเพิ่มเติมและตัวเลือกสำหรับSEQUENCE


วิธีนี้เป็นวิธีที่ถูกต้องถ้าคุณสนใจลำดับเวลาของแถวที่ใส่เพราะIDENTITYบางครั้งก็กระโดดออกจากช่องว่างแล้วมันก็กลับมาเติมช่องว่างเหล่านั้นอีกครั้ง ดังนั้นจึงIDENTITYไม่รับประกันสภาพที่ถูกต้องเสมอ
FindOut_Quran

1
@ มาร์ตินสมิ ธ โอ๊ะฉันไม่ได้ติดตามลิงก์ ฉันเคยชินกับ MS-SQL ที่ไม่มีคุณสมบัติบางอย่างที่บางครั้งฉันลืมไปว่ามีรุ่นที่ใหม่กว่าที่รองรับเนื้อหามากกว่านี้ ฉันจะลบความคิดเห็นของฉันเพราะมันอาจทำให้เกิดความสับสน ... หากแสดงให้เห็นทั่วไปมันยังคงใช้ได้แม้ว่า: อาจเป็นเพราะเขาใช้ RDBMS ทำ / รุ่นที่ไม่สนับสนุนวัตถุ SEQUENCE - โดยเฉพาะเมื่อคำถามถูกถามเท่านั้น ไม่กี่เดือนหลังจากเปิดตัว SQL Server 2012;)
Paul Groke

1
@FindOut_Quran คุณแน่ใจหรือไม่ว่าช่องว่างในคอลัมน์ IDENTITY เต็มแล้ว ฉันทำงานกับ SQL Server 2005 ซึ่งฉันไม่เคยเห็นสิ่งนั้นเกิดขึ้น - ช่องว่างก็ยังคงอยู่ และฉันค่อนข้างประหลาดใจที่เห็นว่ามันเกิดขึ้นใน RDBMS ใด ๆ เพราะคุณสมบัติดังกล่าวจะเป็นการผสมผสานที่แปลกประหลาดของ "ไม่ฟรี" (ประสิทธิภาพที่ชาญฉลาด) และ "ไม่เป็นที่ต้องการ" (อย่างน้อยในแอปพลิเคชันส่วนใหญ่)
Paul Groke

@ PaulGroke ใช่ฉันแน่ใจ คุณสามารถลองใช้ธุรกรรมเพื่อแทรก 1,000 แถวจากนั้นย้อนกลับ ค่า idenetity จะ jumb up พยายามที่จะแทรกหลายพันแถวและกระทำ / หรือย้อนกลับ คุณจะสังเกตเห็นว่าบางครั้งมันกลับเติมช่องว่าง
FindOut_Quran

@FindOut_Quran ฉันไม่เห็นว่าสิ่งนี้จะเกิดขึ้นได้อย่างไร คอลัมน์ MS SQL IDENTITY ใช้ตัวนับแบบง่ายซึ่ง seeded ที่ค่าที่ผู้ใช้กำหนดได้และจากนั้นเพิ่มขึ้นด้วยค่าที่ผู้ใช้กำหนดได้ คุณสามารถสอบถามและตั้งค่าตัวนับใหม่ได้ วิธีเดียวที่ฉันสามารถเห็นสิ่งนี้เกิดขึ้นคือเมื่อการทำธุรกรรมที่เกิดขึ้นพร้อมกันกระทำ "ผิดปกติ" นั่นคือการทำธุรกรรมที่เป็นการชนเคาน์เตอร์ตัวตนแรกที่กระทำหลังจากการทำธุรกรรมอื่น ในกรณีนี้คุณจะมีช่องว่างสั้น ๆ ที่เต็มไปแล้ว ซึ่งจำเป็นต่อการหลีกเลี่ยงการชน ตัวนับ IDENTITY จะไม่ข้ามกลับไปเลย
Paul Groke

7

เมื่อคุณใช้ Data Type: int คุณสามารถเลือกแถวที่คุณต้องการได้รับการรวมอัตโนมัติและไปที่แท็กคุณสมบัติคอลัมน์ คุณสามารถตั้งค่าตัวตนเป็น 'ใช่' ค่าเริ่มต้นสำหรับการสร้างอัตโนมัติยังสามารถแก้ไขได้ที่นั่น หวังว่าฉันจะช่วยได้;)


คุณสมบัติคอลัมน์อยู่ที่ไหน

2

ฉันมีปัญหานี้ซึ่งฉันได้สร้างตารางแล้วแล้วและไม่สามารถเปลี่ยนแปลงได้โดยไม่ต้องวางตารางดังนั้นสิ่งที่ฉันทำคือ: (ไม่แน่ใจว่าเมื่อพวกเขาใช้สิ่งนี้ แต่มีใน SQL 2016)

คลิกขวาที่ตารางใน Object Explorer:

Script Table as > DROP And CREATE To > New Query Editor Window

จากนั้นทำการแก้ไขสคริปต์ที่โจเซียนพูด เลื่อนไปที่ด้านล่างที่มีCREATE TABLEอยู่ค้นหาคีย์หลักของคุณและผนวกIDENTITY(1,1)ไปยังจุดสิ้นสุดก่อนเครื่องหมายจุลภาค เรียกใช้สคริปต์

สคริปต์ DROP และ CREATE ก็มีประโยชน์สำหรับฉันเช่นกันเนื่องจากปัญหานี้ (ซึ่งสคริปต์ที่สร้างขึ้นจัดการได้)


1

ระวังถ้าคุณต้องการให้องค์ประกอบ ID เป็นจุดเชื่อมต่อหรือไม่ ในฐานะที่เป็น SQLSERVER ID สามารถกระโดดได้ 1,000

ตรวจสอบ: ก่อนที่จะรีสตาร์ท ID = 11 หลังจากรีสตาร์ทคุณแทรกแถวใหม่ในตารางจากนั้น ID จะเป็น 1012


1

คุณสามารถใช้คำหลักIDENTITYเป็นชนิดข้อมูลไปยังคอลัมน์พร้อมกับPRIMARY KEYข้อ จำกัด เมื่อสร้างตาราง
อดีต:

StudentNumber IDENTITY(1,1) PRIMARY KEY

ในที่นี้ '1' แรกหมายถึงค่าเริ่มต้นและที่สอง '1' เป็นค่าที่เพิ่มขึ้น


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL Server ใช้คำสำคัญตัวตนเพื่อทำการเพิ่มคุณสมบัติอัตโนมัติ

ในตัวอย่างด้านบนค่าเริ่มต้นสำหรับ IDENTITY คือ 1 และจะเพิ่มขึ้น 1 สำหรับแต่ละระเบียนใหม่

เคล็ดลับ: เมื่อต้องการระบุว่าคอลัมน์ "Personid" ควรเริ่มต้นที่ค่า 10 และเพิ่มขึ้น 5 ให้เปลี่ยนเป็น IDENTITY (10,5)

ในการแทรกบันทึกใหม่ลงในตาราง "บุคคล" เราจะไม่ต้องระบุค่าสำหรับคอลัมน์ "Personid" (ค่าที่ไม่ซ้ำจะถูกเพิ่มโดยอัตโนมัติ):


0

หากตารางนั้นมีประชากรอยู่แล้วจะไม่สามารถเปลี่ยนคอลัมน์เป็นคอลัมน์ IDENTITY หรือแปลงเป็นคอลัมน์ที่ไม่ใช่ IDENTITY คุณจะต้องส่งออกข้อมูลทั้งหมดจากนั้นคุณสามารถเปลี่ยนประเภทคอลัมน์เป็นตัวตนหรือในทางกลับกันแล้วนำเข้าข้อมูลกลับ ฉันรู้ว่ามันเป็นกระบวนการที่เจ็บปวด แต่ฉันเชื่อว่าไม่มีทางเลือกอื่นนอกจากใช้ลำดับตามที่กล่าวไว้ในโพสต์นี้


1
คุณสามารถใช้ALTER TABLE ... SWITCHเพียงแค่สลับเมทาดาทาโดยไม่ต้องแตะข้อมูลเลย เช่นดูวิธีการตั้งค่าการเพิ่มอัตโนมัติหลังจากสร้างตารางโดยไม่มีการสูญหายของข้อมูล?
Martin Smith

1
กระบวนการที่กล่าวถึงในลิงค์ที่คุณให้ไว้นั้นเกี่ยวข้องกับการถ่ายโอนข้อมูลไปยังตารางชั่วคราวและด้านหลังซึ่งเห็นด้วยกับคำสั่งของฉันด้านบน หากฉันผิดโปรดยกตัวอย่างการทำงานให้ฉัน
Softec

1
มีตัวอย่างการทำงานในลิงค์ ไม่มี "การถ่ายโอนข้อมูลไปยังตารางชั่วคราวและย้อนกลับ" `เปลี่ยนแปลงตาราง ... สวิตช์ 'เป็นข้อมูลเมตาเท่านั้นที่เปลี่ยนแปลง มันไม่ย้ายข้อมูลใด ๆ
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.