คำถามติดแท็ก identity

สร้างคอลัมน์ข้อมูลประจำตัวในตาราง คุณสมบัตินี้ใช้กับคำสั่ง CREATE TABLE และ ALTER TABLE Transact-SQL

10
ทำไมคนไม่แนะนำให้ใช้ชื่อ“ Id” สำหรับคอลัมน์ข้อมูลประจำตัว
ฉันถูกสอนไม่ให้ใช้ชื่อIdสำหรับคอลัมน์ข้อมูลประจำตัวของตารางของฉัน แต่เมื่อเร็ว ๆ นี้ฉันเพิ่งใช้มันอย่างไรก็ตามเพราะมันง่ายสั้นและอธิบายมากเกี่ยวกับข้อมูลจริง ๆ ฉันเคยเห็นคนแนะนำคำนำหน้าIdด้วยชื่อตาราง แต่ดูเหมือนว่าจะทำให้การทำงานมากขึ้นสำหรับผู้ที่เขียนคำสั่ง SQL (หรือโปรแกรมเมอร์ถ้าคุณใช้ ORM เช่น Entity Framework) โดยเฉพาะชื่อตารางที่ยาวขึ้นเช่นCustomerProductIdหรือAgencyGroupAssignementId หนึ่งในผู้จัดจำหน่ายของบุคคลที่สามที่เราได้รับการว่าจ้างในการสร้างบางสิ่งบางอย่างสำหรับเราจริงชื่อคอลัมน์ตัวตนของพวกเขาทั้งหมดเพียงเพื่อหลีกเลี่ยงการใช้Ident Idตอนแรกฉันคิดว่าพวกเขาทำอย่างนั้นเพราะIdเป็นคำหลัก แต่เมื่อฉันดูมันฉันพบว่าIdไม่ใช่คำหลักใน SQL Server 2005 ซึ่งเป็นสิ่งที่เราใช้ เหตุใดผู้คนจึงไม่แนะนำให้ใช้ชื่อIdสำหรับคอลัมน์ข้อมูลประจำตัว แก้ไข:เพื่อชี้แจงฉันไม่ได้ถามแบบแผนการตั้งชื่อที่จะใช้หรือหาข้อโต้แย้งที่จะใช้แบบแผนการตั้งชื่อแบบหนึ่งเหนืออีกแบบ ฉันแค่อยากรู้ว่าทำไมจึงไม่แนะนำให้ใช้Idสำหรับชื่อคอลัมน์ข้อมูลประจำตัว ฉันเป็นโปรแกรมเมอร์ตัวเดียวไม่ใช่ dba และสำหรับฉันแล้วฐานข้อมูลเป็นที่สำหรับเก็บข้อมูลของฉัน เนื่องจากฉันมักจะสร้างแอพขนาดเล็กและโดยทั่วไปจะใช้ ORM สำหรับการเข้าถึงข้อมูลชื่อฟิลด์ทั่วไปสำหรับฟิลด์ข้อมูลประจำตัวจึงทำงานได้ง่ายกว่ามาก ฉันต้องการที่จะรู้ว่าสิ่งที่ฉันพลาดในการทำเช่นนี้และถ้ามีเหตุผลที่ดีจริงๆสำหรับฉันที่จะไม่ทำเช่นนี้

10
ฉันจะคัดลอกตารางด้วย SELECT INTO ได้อย่างไร แต่ไม่สนใจคุณสมบัติตัวตน
ฉันมีตารางที่มีคอลัมน์ระบุตัวตน: create table with_id ( id int identity(1,1), val varchar(30) ); มันเป็นที่รู้จักกันดีว่าสิ่งนี้ select * into copy_from_with_id_1 from with_id; ผลลัพธ์ใน copy_from_with_id_1 พร้อมรหัสประจำตัวด้วย คำถามล้นสแต็คต่อไปนี้กล่าวถึงรายการคอลัมน์ทั้งหมดอย่างชัดเจน มาลองกัน select id, val into copy_from_with_id_2 from with_id; อ๊ะแม้ในกรณีนี้ id จะเป็นคอลัมน์ข้อมูลประจำตัว สิ่งที่ฉันต้องการคือโต๊ะ create table without_id ( id int, val varchar(30) );

2
วิธีที่ดีที่สุดในการแทรกข้อมูลประจำตัวสุดท้ายในตาราง
ตัวเลือกใดเป็นตัวเลือกที่ดีที่สุดในการรับค่าตัวตนที่ฉันเพิ่งสร้างผ่านการแทรก อะไรคือผลกระทบของแถลงการณ์เหล่านี้ในแง่ของประสิทธิภาพ? SCOPE_IDENTITY() ฟังก์ชันการรวม MAX() SELECT TOP 1IdentityColumn จาก TableNameORDER BY IdentityColumn DESC

7
เกณฑ์การจับคู่ขั้นต่ำอะไรที่แนะนำสำหรับการจับคู่ผู้ป่วยด้วยข้อมูลประชากรที่เชื่อถือได้
เมื่อจับคู่ผู้ป่วยตามข้อมูลประชากรมีคำแนะนำใด ๆ เกี่ยวกับเขตข้อมูลใดที่ควรจับคู่กับผู้ป่วยให้เป็น "ผู้ป่วยรายเดียวกัน" ฉันรู้ว่าอัลกอริทึมจะแตกต่างกันสำหรับการใช้งานที่แตกต่างกันฉันแค่อยากรู้ว่ามีวิธีปฏิบัติที่ดีที่สุดหรือคำแนะนำเกี่ยวกับกระบวนการนี้ First Name Last Name Date of Birth SSN Address City State Zip etc?
30 identity 

6
ฉันสามารถอ่านค่า SQL Server Identity ตามลำดับได้หรือไม่?
TL: DR:คำถามด้านล่างนี้ลดลงเหลือ: เมื่อแทรกแถวจะมีหน้าต่างของโอกาสระหว่างการสร้างIdentityค่าใหม่และการล็อคกุญแจแถวที่สอดคล้องกันในดัชนีคลัสเตอร์ซึ่งผู้สังเกตการณ์ภายนอกจะเห็นที่ใหม่กว่า Identityมูลค่าแทรกโดยการทำธุรกรรมพร้อมกันหรือไม่ (ใน SQL Server) รุ่นโดยละเอียด ฉันมีตาราง SQL Server พร้อมIdentityคอลัมน์ที่เรียกว่าCheckpointSequenceซึ่งเป็นกุญแจสำคัญของดัชนีคลัสเตอร์ของตาราง (ซึ่งยังมีดัชนี nonclustered เพิ่มเติมอีกจำนวนหนึ่ง) แถวถูกแทรกเข้าไปในตารางโดยกระบวนการและเธรดพร้อมกันจำนวนมาก (ที่ระดับการแยกREAD COMMITTEDและไม่มีIDENTITY_INSERT) ในเวลาเดียวกันมีกระบวนการที่อ่านแถวจากดัชนีคลัสเตอร์เป็นระยะโดยเรียงลำดับตามCheckpointSequenceคอลัมน์นั้น(เช่นเดียวกับที่ระดับการแยกREAD COMMITTEDด้วยREAD COMMITTED SNAPSHOTตัวเลือกที่ถูกปิด) ขณะนี้ฉันพึ่งพาข้อเท็จจริงที่ว่ากระบวนการอ่านไม่สามารถ "ข้าม" จุดตรวจสอบได้ คำถามของฉันคือ: ฉันสามารถพึ่งพาอสังหาริมทรัพย์นี้ได้หรือไม่? และถ้าไม่ฉันจะทำอย่างไรเพื่อทำให้เป็นจริง ตัวอย่าง: เมื่อแทรกแถวที่มีค่าเอกลักษณ์ 1, 2, 3, 4 และ 5 ผู้อ่านจะต้องไม่เห็นแถวที่มีค่า 5 ก่อนที่จะเห็นแถวที่มีค่า 4 การทดสอบแสดงให้เห็นว่าแบบสอบถามซึ่งมีORDER BY CheckpointSequenceข้อ ( และWHERE CheckpointSequence > -1ประโยค) บล็อกได้อย่างน่าเชื่อถือเมื่อใดก็ตามที่ต้องอ่านแถว 4 …

1
จะปลอดภัยหรือไม่ที่จะพึ่งพาคำสั่งของส่วนคำสั่งเอาท์พุทของ INSERT?
รับตารางนี้: CREATE TABLE dbo.Target ( TargetId int identity(1, 1) NOT NULL, Color varchar(20) NOT NULL, Action varchar(10) NOT NULL, -- of course this should be normalized Code int NOT NULL, CONSTRAINT PK_Target PRIMARY KEY CLUSTERED (TargetId) ); ในสองสถานการณ์ที่แตกต่างกันเล็กน้อยฉันต้องการแทรกแถวและคืนค่าจากคอลัมน์ข้อมูลประจำตัว สถานการณ์ 1 INSERT dbo.Target (Color, Action, Code) OUTPUT inserted.TargetId SELECT t.Color, t.Action, …

6
ข้อเสียของการมีคอลัมน์จำนวนเต็มเดียวเป็นคีย์หลักเสมอ
ภายในเว็บแอปพลิเคชั่นตัวหนึ่งที่ฉันทำงานอยู่การดำเนินการฐานข้อมูลทั้งหมดจะถูกทำให้เป็นนามธรรมโดยใช้แหล่งเก็บข้อมูลทั่วไปที่กำหนดไว้ผ่าน Entity Framework ORM อย่างไรก็ตามเพื่อให้มีการออกแบบที่เรียบง่ายสำหรับที่เก็บข้อมูลทั่วไปตารางที่เกี่ยวข้องทั้งหมดจะต้องกำหนดจำนวนเต็มเฉพาะ ( Int32ใน C #, intใน SQL) จนถึงขณะนี้ได้รับเสมอ PK IDENTITYของตารางและยังได้ คีย์ต่างประเทศมีการใช้งานอย่างหนักและจะอ้างอิงคอลัมน์จำนวนเต็มเหล่านี้ จำเป็นสำหรับทั้งความสอดคล้องและสำหรับการสร้างคุณสมบัติการนำทางโดย ORM โดยทั่วไปแล้วแอปพลิเคชันเลเยอร์จะดำเนินการดังต่อไปนี้: การโหลดข้อมูลเริ่มต้นจากตาราง (*) -SELECT * FROM table อัพเดท -UPDATE table SET Col1 = Val1 WHERE Id = IdVal ลบ -DELETE FROM table WHERE Id = IdVal ส่วนแทรก -INSERT INTO table (cols) VALUES (...) …

2
ช่องว่างที่ไม่คาดคิดในคอลัมน์ IDENTITY
ฉันพยายามสร้างหมายเลขใบสั่งซื้อที่ไม่ซ้ำกันซึ่งเริ่มต้นที่ 1 และเพิ่มขึ้นทีละ 1 ฉันมีตาราง PONumber ที่สร้างโดยใช้สคริปต์นี้: CREATE TABLE [dbo].[PONumbers] ( [PONumberPK] [int] IDENTITY(1,1) NOT NULL, [NewPONo] [bit] NOT NULL, [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(), CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC) ); และขั้นตอนการจัดเก็บที่สร้างขึ้นโดยใช้สคริปต์นี้: CREATE PROCEDURE [dbo].[GetPONumber] AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1); SELECT SCOPE_IDENTITY() AS …

3
รีเซ็ตค่าตัวตน
ฉันมีตารางที่มีคอลัมน์ประจำตัว ในขณะที่กำลังพัฒนาฉันจะลบแถวเป็นครั้งคราวและเพิ่มอีกครั้ง แต่ค่าตัวตนต่าง ๆ เพิ่มขึ้นเรื่อย ๆ และไม่ได้เริ่มต้นจาก 1 เมื่อฉันเพิ่มพวกเขาอีกครั้ง ตอนนี้รหัสของฉันไปจาก 68 -> 92 และนี่ทำให้รหัสของฉันล่ม ฉันจะรีเซ็ตค่าตัวตนได้อย่างไร

3
เหตุใด SSMS จึงแทรกแถวใหม่ที่ด้านบนของตารางไม่ใช่ด้านล่าง
เมื่อใดก็ตามที่ฉันแทรกแถวลงในตารางด้วยตนเองใน SQL Server Management Studio 2008 (ฐานข้อมูลคือ SQL Server 2005) แถวใหม่ของฉันจะปรากฏที่ด้านบนของรายการมากกว่าด้านล่าง ฉันใช้คอลัมน์ข้อมูลประจำตัวและผลลัพธ์เช่นนี้ id row 42 first row 1 second row 2 third row เมื่อแถวถูกดึงออกมาและไม่ได้เรียงลำดับอย่างชัดเจน สิ่งนี้ส่งผลให้มีลักษณะที่แตกต่างเมื่อดึงแถวสำหรับเว็บแอปและเปลี่ยนสิ่งที่TOP 1แบบสอบถามส่งกลับ ฉันรู้ว่าฉันทำได้order byแต่ทำไมสิ่งนี้จึงเกิดขึ้น ข้อมูลส่วนใหญ่ของฉันถูกแทรกผ่านเว็บแอปพลิเคชันการแทรกทั้งหมดจากแอปพลิเคชันนี้ทำให้การสั่งซื้อครั้งแรกในครั้งแรกเช่นการแทรกครั้งล่าสุดอยู่ที่ด้านล่างดังนั้นรหัสทั้งหมดอยู่ในแถว มีการตั้งค่าบางอย่างในเซิร์ฟเวอร์หรือ Studio จัดการที่เป็นสาเหตุของการสั่งซื้อที่ไม่เหมาะสมนี้หรือไม่?

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

3
วิธีแทรกในตารางที่มีเฉพาะคอลัมน์ตัวตนได้อย่างไร
เมื่อกำหนดตารางที่มีเพียงคอลัมน์ IDENTITY คุณจะแทรกแถวใหม่ได้อย่างไร ฉันได้ลองทำสิ่งต่อไปนี้แล้ว: INSERT INTO TABLE (Syntax error) INSERT INTO TABLE VALUES() (Syntax error) INSERT INTO TABLE (Id) VALUES() (Syntax error) ฉันกำลังทดสอบบางอย่างและต้องการเพียงคอลัมน์ตัวตน ไม่ใช่เพื่อการผลิต มิฉะนั้นตารางดังกล่าวสามารถใช้เป็นเครื่องกำเนิดไฟฟ้าตามลำดับที่ไม่จำเป็นต้องมีคอลัมน์อื่น ๆ

1
SQL Server เก็บค่าความเป็นตัวตนของตารางไว้ที่ใด
ฉันหวังว่าบางคนสามารถชี้ฉันไปในทิศทางที่ถูกต้องในอันนี้ นี่คือผลงานของฉันจนถึงตอนนี้ SELECT * FROM sys.identity_columnsคือมุมมองระบบที่ให้ "last_value" แต่คำจำกัดความสำหรับมุมมองนั้นใช้ฟังก์ชันภายในIdentityProperty(colName, 'LastValue')- นั่นคือจุดสิ้นสุด (ไม่ดึงออกจากตารางระบบที่นั่น) ทุกที่ (ฉันดู) บนอินเทอร์เน็ตแนะนำให้ใช้DBCC IDENT_...คำสั่งเพื่อเปิดเผยค่า แต่ก็ยังทำให้ฉันอยู่ในที่มืดราวกับว่ามันถูกเก็บไว้ที่ไหน ดังนั้นฉันมาถึงการค้นหาหน้าเว็บแต่ละหน้าพร้อมDBCC PAGE(TestDB,1,1325,3)กับชุดทดสอบฐานข้อมูลของฉันและการใช้RESEEDคำสั่งเพื่อดำเนินการระหว่างค่า 10 และ 12 ในการนี้ผมสังเกตเห็นค่าฐานสิบหกบนIAM: Header, IAM: Single Page AllocationsและIAM: Extent Alloc Status Slot 1การเปลี่ยนแปลงทั้งหมด (และตระหนักว่าพวกเขามีการเปลี่ยนแปลงเป็นระยะอยู่แล้วพร้อมกับค่าbUse1ซึ่งการเปลี่ยนแปลงที่เพิ่มขึ้นด้วยตัวเองเช่นกัน) ดังนั้นจุดจบอื่นและฉันหมดความคิด ฉันสามารถค้นหาได้ที่ไหน ฉันใช้ SQL Server 2014 ฉันมีความกระหายที่ไม่รู้จักพอสำหรับความรู้ภายในและยังไม่เจออะไรที่เข้าใจยากเช่นนี้ มันดึงดูดความสนใจของฉันได้เพราะในทางทฤษฎีแล้วมัน (ค่าสัมบูรณ์) ถูกเก็บไว้ที่ไหนสักแห่งและควรระบุตำแหน่ง (เนื้อหา) ในการสืบเสาะหาที่ตั้งของข้อมูล / เมตาดาต้าที่เก็บไว้ภายในค่านี้จะทำให้ฉันเข้าใจยากเป็นพิเศษ ฉันคาดเดา / หวังว่าจะมีใครบางคนเข้ามาและบอกฉันคุณสามารถเอามันไปด้วยDBCC …

2
ประสิทธิภาพของคีย์หลักคอมโพสิตเป็นคีย์ต่างประเทศ
ฉันมีตารางที่มีคีย์หลักคอมโพสิต (ประกอบด้วย 4 คอลัมน์) ซึ่งใช้เพื่อให้แน่ใจว่าไม่มีรายการที่ซ้ำกันถูกป้อนลงในตาราง ตอนนี้ฉันต้องการโต๊ะใหม่ซึ่งจะต้องอ้างอิงคีย์ในตารางนี้เป็นคีย์ต่างประเทศ คำถามของฉันคือวิธีใดที่มีประสิทธิภาพมากกว่าสำหรับความเร็วการค้นหา: 1) ฉันจะสร้างตารางใหม่รวมทั้งคอลัมน์ทั้ง 4 และอ้างอิงพวกเขาทั้งหมดในคีย์ต่างประเทศ หรือ 2) ฉันจะสร้างคอลัมน์ข้อมูลประจำตัวใหม่ในตารางคีย์หลักและใช้เป็นคีย์ต่างประเทศในตารางใหม่หรือไม่ ฐานข้อมูลนี้คาดว่าจะเก็บข้อมูลจำนวนมากดังนั้นฉันได้สร้างมันขึ้นมาจนถึงตอนนี้ด้วยมุมมองที่จะลดจำนวนข้อมูลที่เก็บไว้ในแต่ละตาราง ด้วยสิ่งนี้ในใจตัวเลือก 2 จะเป็นวิธีที่ดีที่สุดเนื่องจากฉันจะบันทึก 2 คอลัมน์และคอลัมน์วันที่สำหรับทุกแถว แต่ฉันต้องการหลีกเลี่ยงการเพิ่มเวลาการค้นหาหากไม่จำเป็น

4
คอลัมน์รหัสประจำตัวอีกครั้ง: เมื่อจำเป็นหรือไม่
ในช่วงหนึ่งของบทเรียนสุดท้ายที่มหาวิทยาลัย (ฉันเป็นนักเรียน) อาจารย์ขอให้เราพัฒนาฐานข้อมูล (MySQL Server ถ้ามันเป็นเรื่องสำคัญ) และแอปไคลเอ็นต์ขนาดเล็กที่ใช้ฐานข้อมูลเป็นแหล่งข้อมูล หนึ่งในข้อกำหนดคือคอลัมน์ประจำตัว (ซึ่งคือ PK ในทุกตาราง) จะต้องเรียงตามลำดับเพราะเป็นการปฏิบัติที่ดี (ตามคำของอาจารย์) กล่าวคือเมื่อลบแถวของตารางจะต้องมีการนำ PK กลับมาใช้ใหม่ในส่วนแทรกภายหลัง ฉันมีความรู้โดยเฉลี่ยเกี่ยวกับ RDBMS, PKs และคอลัมน์ข้อมูลประจำตัว จากสิ่งที่ฉันเข้าใจคอลัมน์ข้อมูลประจำตัวนั้นเป็นเพียงวิธีให้ DB สร้างอัตโนมัติ PK เมื่อแทรกแถวและไม่มีอะไรเพิ่มเติม และค่าคอลัมน์ข้อมูลประจำตัวจะไม่เกี่ยวข้องกับแอตทริบิวต์แถวในทางใด ๆ (ตราบใดที่มันไม่ใช่คีย์ธรรมชาติ) ข้อกำหนดนี้ (คอลัมน์ข้อมูลประจำตัวตามลำดับอย่างเคร่งครัด) เป็นที่น่าสงสัยสำหรับฉัน ฉันพยายามถามอาจารย์ว่าเกิดอะไรขึ้นถ้าตัวตนไม่ได้เรียงตามลำดับ (ด้วยช่องว่างที่เกิดจากการลบ) แต่ได้คำตอบที่เป็นนามธรรมเช่น "สะดวกสำหรับผู้ใช้และเป็นประโยชน์สำหรับผู้ดูแลฐานข้อมูลที่ดูแลฐานข้อมูล" ไม่มีตัวอย่างเฉพาะ อาร์กิวเมนต์ "สะดวกสำหรับผู้ใช้" ฟังดูไม่ดีเพราะไม่มีความหมายใด ๆ ในโดเมนธุรกิจ ดังนั้นฉันอยากรู้ว่าเหตุผลเหล่านี้เป็นจริงหรือไม่ ฉันสามารถคิดได้เพียงกรณีเดียวเท่านั้นที่ต้องมีการระบุคอลัมน์ข้อมูลประจำตัวใหม่ - เมื่อพื้นที่ข้อมูลส่วนบุคคลหมดแล้ว แต่นี่เป็นปัญหาการออกแบบที่มากขึ้นเมื่อเลือกคอลัมน์ประเภทข้อมูลระบุตัวตนไม่ถูกต้องพูดง่าย ๆintแทนbigintหรือuniqueidentifierเมื่อตารางมีจำนวนพันล้านแถว สมมติว่าคอลัมน์ข้อมูลประจำตัวเป็นดัชนีกลุ่ม: ช่องว่างในคอลัมน์ข้อมูลระบุตัวตนมีผลต่อประสิทธิภาพของดัชนีหรือไม่ อาจจะมีเหตุผลอื่น …

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