วิธีสร้างตารางด้วยคอลัมน์ประจำตัว


111

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

เมื่อใช้SQL Server Management Studioฉันเขียนสคริปต์"Create To ... "ของตารางที่มีอยู่และได้รับสิ่งนี้:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

คำถามของฉันคือว่าฉันจะปรับเปลี่ยนนี้SQLดังนั้นตารางที่เกิดของฉันมีIDชุดคอลัมน์เป็นเอกลักษณ์ ?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

คำตอบ:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]

1
ฉันเชื่อว่านั่นคือสิ่งที่ฉันกำลังมองหา ฉันไม่จำเป็นต้องเปลี่ยนPK_Historyค่าเป็นIDหรืออะไร?
jp2code

ไม่น่าจะเป็นทั้งหมดที่คุณต้องการ PK_History เป็นเพียงชื่อของข้อ จำกัด ข้อ จำกัด ของคีย์หลักอยู่ใน ID คอลัมน์แล้ว
Gratzy

1
ความหมายของพารามิเตอร์ IDENTITY (1,1)
อะไร


33

สิ่งนี้ได้รับคำตอบแล้ว แต่ฉันคิดว่าไวยากรณ์ที่ง่ายที่สุดคือ:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

ดัชนีข้อ จำกัด ที่ซับซ้อนมากขึ้นมีประโยชน์เมื่อคุณต้องการเปลี่ยนตัวเลือกจริงๆ

อย่างไรก็ตามฉันชอบตั้งชื่อคอลัมน์ HistoryId ดังนั้นจึงตรงกับชื่อของคอลัมน์ในความสัมพันธ์ของคีย์ต่างประเทศ


5
OP ทำงานโดยเฉพาะกับเอาต์พุตของเครื่องมือ GUI ที่เอาต์พุต DDL สำหรับอ็อบเจ็กต์ที่มีอยู่ เครื่องมือนั้นอาจไม่มีตัวเลือก "use simpler syntax if possible" เกิดข้อผิดพลาดน้อยที่สุดสำหรับสถานการณ์เฉพาะของ OP คือการแก้ไขหนึ่งบรรทัดใน DDL ที่สร้างขึ้นและอย่าพยายามเขียนตั้งแต่เริ่มต้นโดยใช้ไวยากรณ์ที่ง่ายที่สุด นอกจากนี้ตัวอย่างที่คุณให้มาไม่ได้กำหนดชื่อให้กับข้อ จำกัด PK ตามที่ OP มี หลายคนชอบข้อ จำกัด ของฉันที่ตั้งชื่อดังนั้นจึงมีชื่อเดียวกันในทุกสภาพแวดล้อม (dev, test, prod) ID int constraint PK_History primary key identity(1,1)ฉันเชื่อ.
Shannon Severance

3
อาจจะอาจจะไม่. ฉันเคยอยู่ในสถานการณ์ที่ฉันนำสคริปต์จากฐานข้อมูลหนึ่งไปใช้บนเซิร์ฟเวอร์อื่นและค่าเริ่มต้นที่ทำงานในที่หนึ่งไม่ได้ดีที่สุดสำหรับอีกที่หนึ่ง ไม่ว่าในกรณีใดฉันแนะนำให้เป็นวิธีแก้ปัญหาเท่านั้นเนื่องจากดูเหมือนง่ายกว่าสำหรับฉัน (โดยส่วนตัวฉันเข้าใจคำหลัก "คีย์หลัก" ดีกว่าที่ฉันเข้าใจตัวเลือกในข้อ จำกัด และฉันพิจารณาใช้ตัวเลือกที่ฉันไม่เข้าใจว่า "ไม่ดี "). อย่างไรก็ตามคุณให้ประเด็นที่ดีว่าเหตุใดจึงควรใช้วิธีแก้ปัญหาอื่น ฉันควรเพิ่มคำตอบนั้นเป็นคำตอบที่ยอมรับแล้ว
Gordon Linoff

@GordonLinoff: Mate คีย์หลักเป็นค่าเริ่มต้นไม่ใช่ null ทำไมคุณต้องระบุอย่างชัดเจนว่า not null ที่นี่?
ผู้เรียน

@ ผู้เรียน. . . ข้อ จำกัด ทั้งสองอยู่ในรหัสของ OP NOT NULLซ้ำซ้อน
Gordon Linoff

12
[id] [int] IDENTITY(1,1) NOT NULL,

แน่นอนว่าเนื่องจากคุณกำลังสร้างตารางใน SQL Server Management Studio คุณสามารถใช้ตัวออกแบบตารางเพื่อตั้งค่า Identity Specification

ใส่คำอธิบายภาพที่นี่


1
ขอบคุณ Phil ฉันรู้วิธีทำ แต่ทำไม่ได้เพราะโต๊ะนั้นมีอยู่แล้ว ฉันต้องลบตารางและสร้างมันขึ้นมาใหม่ดังนั้นฉันจึงใช้สคริปต์
jp2code

4
@ jp2code: ฉันหมายความว่าคุณสามารถสร้างตารางทดสอบด้วยคอลัมน์ Identity จากนั้นเขียนสคริปต์เพื่อดูว่าควรระบุอย่างไร
ฟิลิป

-2

คีย์ที่ไม่ซ้ำกันให้ค่า NULL สูงสุด 2 ค่า คำอธิบาย:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

หากคุณลองแทรกค่าเดียวกันกับด้านล่าง:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

ทุกครั้งคุณจะได้รับข้อผิดพลาดเช่น:

การละเมิดข้อ จำกัด UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42' ไม่สามารถแทรกคีย์ที่ซ้ำกันในวัตถุ 'dbo.teppp'
คำสั่งยุติแล้ว


ฉันต้องการทำให้IDคอลัมน์ไม่ซ้ำกันไม่ใช่Nameคอลัมน์ เหตุใดคุณจึงเพิ่มข้อ จำกัดเฉพาะในNameคอลัมน์ สิ่งนี้มีประโยชน์ต่อคุณอย่างไรในtepppตารางของคุณ?
jp2code

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