SQL Server เพิ่มคีย์หลักที่เพิ่มขึ้นอัตโนมัติไปยังตารางที่มีอยู่


253

ในฐานะที่เป็นชื่อฉันมีตารางที่มีอยู่ซึ่งมีประชากร 150000 รายการอยู่แล้ว ฉันได้เพิ่มคอลัมน์รหัส (ซึ่งปัจจุบันเป็นโมฆะ)

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

คำตอบ:


429

ไม่ - คุณต้องทำอย่างอื่น: เพิ่มที่ถูกต้องจากการเริ่มต้นINT IDENTITY- มันจะเต็มไปด้วยค่าตัวตนเมื่อคุณทำสิ่งนี้:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

และจากนั้นคุณสามารถทำให้มันเป็นคีย์หลัก:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

หรือถ้าคุณต้องการทำทั้งหมดในขั้นตอนเดียว:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

2
นี่เป็นคำตอบที่ดีจริงๆ แต่ฉันจะเปลี่ยนจำนวนเต็มเริ่มต้นจาก 1 เป็น 1,000 ได้อย่างไร ฉันต้องการที่จะเริ่มต้นนับที่ 1,000 ฉันสงสัยว่าฉันสามารถใช้ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1แต่ฉันไม่ต้องการที่จะลองโดยไม่ต้องตรวจสอบกับผู้เชี่ยวชาญ :) อ้างอิง pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
ฉันเพิ่งใช้มันและดูเหมือนว่าจะใช้งานได้alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388

1
@stom: หากคุณไม่ได้ระบุอะไรไว้ seed = 1 และ increment = 1 จะถูกใช้ซึ่งเป็นการตั้งค่าที่ใช้บ่อยที่สุดอยู่แล้ว ถ้าคุณสร้างตารางแบบนี้ - มันจะใช้ได้ดี แต่ฉันขอแนะนำให้ระบุ seed และการเพิ่มในสคริปต์ SQL ของคุณอย่างชัดเจนเสมอ - โดยเฉพาะอย่างยิ่งสำหรับไซต์ที่ใหญ่กว่า มันเป็นแค่แนวปฏิบัติที่ดี
marc_s

1
@stom: PRIMARY KEYหมายถึงที่NOT NULLอยู่ในสถานที่ - ดังนั้นอีกครั้ง - มันไม่จำเป็นจริงๆ แต่ฉันชอบที่จะชัดเจนและดังนั้นฉันมักจะมีที่NOT NULLนั่นเพียงเพื่อให้ชัดเจนอย่างแน่นอน
marc_s

3
@ turbo88: เมื่อคุณกำหนดPRIMARY KEYดัชนีคลัสเตอร์จะถูกสร้างขึ้นโดยอัตโนมัติสำหรับคุณ (เว้นแต่คุณจะระบุไว้อย่างชัดเจนNONCLUSTERED)
marc_s

19

คุณไม่สามารถ "เปิด" ตัวตน: มันเป็นตารางที่สร้างใหม่

หากคุณไม่สนใจเกี่ยวกับการสั่งซื้อหมายเลขคุณจะต้องเพิ่มคอลัมน์ไม่ใช่ค่า NULL ด้วยข้อมูลเฉพาะตัวในครั้งเดียว แถว 150k มีจำนวนไม่มาก

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


5
OP อยู่บน SQL Server 2008 ดังนั้นจึงมีวิธี
Martin Smith

อินสแตนซ์ทั้งหมดจะต้องเริ่มต้นในโหมดผู้ใช้คนเดียวดังนั้นอาจไม่สามารถทำงานได้ในสถานการณ์ส่วนใหญ่ แต่ALTER TABLE ... SWITCHสามารถทำได้โดยไม่ต้องทำเช่นนั้น
Martin Smith

11

ฉันมีปัญหานี้ แต่ไม่สามารถใช้คอลัมน์ข้อมูลประจำตัว (ด้วยเหตุผลต่าง ๆ ) ฉันตัดสินในเรื่องนี้:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

ที่ยืมมาจากที่นี่


4

หากคอลัมน์มีอยู่แล้วในตารางของคุณและมันเป็นโมฆะคุณสามารถอัปเดตคอลัมน์ด้วยคำสั่งนี้ (แทนที่ id, tablename และ tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

คุณช่วยฉันด้วยเวลานี้! ภาคผนวกที่ดีสำหรับคำตอบของ @ gbn
Kristen Waite

2

เมื่อเราเพิ่มและคอลัมน์ข้อมูลประจำตัวในตารางที่มีอยู่มันจะเติมข้อมูลโดยอัตโนมัติโดยไม่จำเป็นต้องเติมข้อมูลด้วยตนเอง


2

โดยนักออกแบบคุณสามารถตั้งค่า identity (1,1) คลิกขวาที่ tbl => desing => ในส่วนซ้าย (คลิกขวา) => Properties => ในคอลัมน์ข้อมูลประจำตัวเลือก #column

คุณสมบัติ

คอลัมน์ idendtity


1
คุณมีข้อมูลว่านี่เป็นวิธีการที่ดีหรือไม่? OP กำลังถามว่าเป็น "วิธีที่ถูกต้องในการดำเนินการ" คำตอบที่สมบูรณ์มากขึ้นจะช่วยให้พวกเขารู้ข้อดี / ข้อเสียของวิธีการ
jinglesthula

จริง ๆ แล้วฉันใช้ตัวเลือกนี้ในสภาพแวดล้อมการพัฒนาถ้าคุณไม่ผ่านการเปลี่ยนแปลงการผลิตคุณควรยืนยันด้วย VIEW DEPENDENCY หากมีการใช้ฟิลด์ตัวตนโดยบางขั้นตอนของร้านค้า o ทริกเกอร์
gustavo herrera

2

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

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

0

นี่คือความคิดที่คุณสามารถลองได้ ตารางดั้งเดิม - ไม่มีคอลัมน์ข้อมูลประจำตัว table1 สร้างตารางใหม่ - เรียก table2 พร้อมกับคอลัมน์ข้อมูลประจำตัว คัดลอกข้อมูลจาก table1 ไปที่ table2 - คอลัมน์ข้อมูลประจำตัวจะถูกเติมโดยอัตโนมัติพร้อมกับตัวเลขที่เพิ่มขึ้นอัตโนมัติ

เปลี่ยนชื่อตารางเดิม - table1 เป็น table3 เปลี่ยนชื่อตารางใหม่ - table2 เป็น table1 (ตารางต้นฉบับ) ตอนนี้คุณมี table1 ที่มีคอลัมน์ identity รวมอยู่และเติมข้อมูลที่มีอยู่แล้ว หลังจากทำให้แน่ใจว่าไม่มีปัญหาและทำงานอย่างถูกต้องให้วาง table3 เมื่อไม่ต้องการใช้อีกต่อไป


0

สร้างตารางใหม่ที่มีชื่อแตกต่างกันและคอลัมน์เดียวกัน, คีย์หลักและสมาคมต่างประเทศและเชื่อมโยงสิ่งนี้ในคำสั่งแทรกรหัสของคุณ ตัวอย่างเช่น: สำหรับพนักงานให้แทนที่ด้วยพนักงาน

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

อย่างไรก็ตามคุณต้องลบตาราง EMPLOYEE ที่มีอยู่หรือทำการปรับเปลี่ยนตามความต้องการของคุณ


0

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

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO

0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
คุณอธิบายได้ไหม
Muhammad Dyas Yaskur

1
ในขณะที่รหัสนี้อาจแก้ไขปัญหาของ OP ได้ดีที่สุดคือการรวมคำอธิบายเกี่ยวกับวิธีที่รหัสของคุณแก้ไขปัญหาของ OP ด้วยวิธีนี้ผู้เข้าชมในอนาคตสามารถเรียนรู้จากโพสต์ของคุณและนำไปใช้กับรหัสของตนเอง ดังนั้นไม่ใช่บริการการเข้ารหัส แต่เป็นแหล่งความรู้ นอกจากนี้คุณภาพสูงและคำตอบที่สมบูรณ์มีแนวโน้มที่จะถูกถอนออก คุณสมบัติเหล่านี้พร้อมด้วยข้อกำหนดที่โพสต์ทั้งหมดมีอยู่ในตัวเองเป็นจุดแข็งของ SO ในฐานะแพลตฟอร์มที่แตกต่างจากฟอรัม คุณสามารถแก้ไขเพื่อเพิ่มข้อมูลเพิ่มเติม & / หรือเสริมคำอธิบายของคุณด้วยเอกสารต้นฉบับ
ysf

-1

เปลี่ยนตาราง / ** วางชื่อของแท็บ ** / เพิ่ม id int IDENTITY (1,1)

ลบออกจาก / ** วางชื่อของแท็บ ** / ที่ id ใน

(

เลือก a.id FROM / ** วางชื่อของแท็บ/ เป็น LEU OUTER JOIN (SELECT MIN (id) เป็น id จาก /วางชื่อของ tabal / GROUP BY / วางคอลัมน์ c1, c2 .... ** / /

) as t1 
ON a.id = t1.id

ที่ t1.id เป็นโมฆะ

)

เปลี่ยนตาราง / ** วางชื่อของแท็บ ** / DROP COLUMN id


คำถามของคุณคืออะไร ถามได้อย่างไร
Ann Kilzer

1
แก้ไขคำตอบของคุณโดยใช้ markdown เพื่อจัดรูปแบบตัวอย่างรหัสของคุณให้ถูกต้อง
Bill Keller

-3

ลองอะไรเช่นนี้ (บนโต๊ะทดสอบก่อน):

ใช้ your_database_name
ไป
ในขณะที่ (เลือก COUNT (*) จาก your_table WHERE your_id_field ว่างเปล่า)> 0
เริ่ม
    ชุด ROWCOUNT 1
    อัปเดต your_table ของคุณ SET your_id_field = MAX (your_id_field) +1
END
พิมพ์ 'เสร็จสิ้น'

ฉันยังไม่ได้ทดสอบสิ่งนี้เลยดังนั้นระวัง!


1
-1 ไม่ตอบคำถาม (ซึ่งเกี่ยวกับการเพิ่มIDENTITYคอลัมน์) และจะไม่ทำงานต่อไป UPDATE your_table SET your_id_field = MAX(your_id_field)+1คุณไม่สามารถเชยที่MAXนั่นได้ ในกรณีที่เป็นWHEREข้อที่จะหลีกเลี่ยงการปรับปรุงเพียงซ้ำ ๆ แถวเดียวกันได้หรือไม่
Martin Smith

-3

ใช้งานได้ใน MariaDB ดังนั้นฉันหวังได้ว่ามันจะเกิดขึ้นใน SQL Server: วางคอลัมน์ ID ที่คุณเพิ่งแทรกจากนั้นใช้ไวยากรณ์ต่อไปนี้: -

แก้ไข table_name ตารางเพิ่ม id INT คีย์หลัก AUTO_INCREMENT

ไม่จำเป็นสำหรับโต๊ะอื่น สิ่งนี้จะแทรกคอลัมน์ id ทำให้ดัชนีหลักและเติมด้วยค่าลำดับ ถ้า SQL Server จะไม่ทำเช่นนี้ฉันขอโทษที่ทำให้คุณเสียเวลา


-3

เปลี่ยน table_name ตารางเพิ่ม ID INT ไม่ใช่ค่า NULL คีย์หลัก AUTO_INCREMENT สิ่งนี้อาจมีประโยชน์

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