ฉันเพิ่มคอลัมน์ใหม่ในตาราง X
คอลัมน์ "cn" นี้จะต้องไม่ซ้ำกันและจำเป็น แต่ข้อมูลเก่าไม่มีค่าใด ๆ
จะอัปเดตระเบียนที่มีอยู่ด้วยข้อมูลเฉพาะที่เป็นลำดับหรือสุ่มได้อย่างไร
ขอขอบคุณ.
ฉันเพิ่มคอลัมน์ใหม่ในตาราง X
คอลัมน์ "cn" นี้จะต้องไม่ซ้ำกันและจำเป็น แต่ข้อมูลเก่าไม่มีค่าใด ๆ
จะอัปเดตระเบียนที่มีอยู่ด้วยข้อมูลเฉพาะที่เป็นลำดับหรือสุ่มได้อย่างไร
ขอขอบคุณ.
คำตอบ:
แม้ว่าฉันคิดว่าคุณได้สร้างคอลัมน์แล้ว แต่ในคำตอบนี้ฉันคิดว่าคอลัมน์นั้นยังไม่มีอยู่ IMO คอลัมน์ต้องไม่ซ้ำกันควรไม่เคยถูกเพิ่มโดยไม่ต้องวางแผนวิธีการเติมแถวที่มีอยู่ครั้งแรก ดังนั้นฉันจะให้วิธีการทำเช่นนี้เริ่มต้นจากศูนย์
วิธีที่คุณทำขึ้นอยู่กับสิ่งที่เกี่ยวข้องในการเติมค่า
หลังจากวิธีใดก็ตามที่คุณใช้เพิ่มข้อ จำกัด ที่ไม่ซ้ำกันในคอลัมน์เพื่อให้แน่ใจว่ามีความถูกต้องของข้อมูล สำหรับวิธีที่ 1 และ 2 สามารถทำได้ภายในคำสั่งเดียวหรือภายในธุรกรรมผู้ใช้ (ไม่แสดง) และควรทำภายในธุรกรรมผู้ใช้ในวิธีที่ 3
อาจมีวิธีอื่นที่ไม่ชัดเจนในการทำเช่นนี้ แต่ฉันคิดว่าฉันได้พูดถึงสิ่งที่พบบ่อยที่สุดแล้ว
วิธีที่ 1: เพิ่มคอลัมน์ประจำตัว
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
สิ่งนี้จะเติมแถวทั้งหมดในตารางที่มีค่าจำนวนเต็มเริ่มต้นด้วยค่าเมล็ด (1) เพิ่มขึ้นโดยเพิ่มค่า (2) สำหรับทุกแถว ฉันเชื่อว่าคำสั่งซื้อที่ได้รับการเติมค่านั้นไม่ได้กำหนดไว้ (ถ้าคุณต้องระบุคำสั่งให้ใช้วิธีที่ 3)
วิธีที่ 2: เติมข้อมูลโดยใช้ข้อ จำกัด เริ่มต้น
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
สิ่งนี้จะทำสามสิ่งด้วยวิธีทางเคมี: 1. เพิ่มคอลัมน์ที่ไม่อนุญาตNULLค่า 2. สร้างข้อ จำกัด เริ่มต้นสำหรับคอลัมน์ 3. เติมแต่ละแถวในตารางโดยใช้ข้อ จำกัด เริ่มต้น
ในขณะที่ตัวอย่างนี้ใช้uniqueidentifierคอลัมน์มันทำงานได้ดีกับชนิดข้อมูลและข้อ จำกัด เริ่มต้น
วิธีที่ 3: เติมข้อมูลโดยใช้คำสั่ง UPDATE
กรณีนี้จะเกิดขึ้นเมื่อตัวอย่างเช่นมีค่าจากส่วนอื่นของแอปพลิเคชันของคุณที่ต้องเพิ่มลงในตารางหรือคุณต้องระบุลำดับที่แน่นอนสำหรับค่าที่ไม่ซ้ำกัน
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
วิธีที่ 4: เติมข้อมูลโดยใช้วัตถุลำดับ
สำหรับ SQL Server 2012 คุณสามารถเติมคอลัมน์โดยใช้ค่าที่สร้างขึ้นโดยSEQUENCEวัตถุ - ฉันยังไม่ได้ทำงานกับสิ่งนี้เลยดังนั้นฉันจะอ้างถึงบทความ MSDNเพื่อความสมบูรณ์
update mytable set mycolumn = next value for mysequence where mycolumn is null;
หากคุณมีความสุขที่มีจำนวนตั้งแต่วันที่ 1 row_number()คุณสามารถใช้
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
คอลัมน์อัพเดตต่อไปนี้ 'cn' พร้อมหมายเลขลำดับเริ่มต้นจาก 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
ลองใช้สิ่งนี้เพื่ออัปเดตโดยใช้ลำดับ ... คุณต้องทำ TOP เนื่องจากลำดับโดยส่วนคำสั่งในการปรับปรุง ฉันใช้คำสั่งนี้ใน SQL SERVER 2012
update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null
order by invoiceId)
และถ้าทั้งหมดนี้ยังจะไม่ทำงาน (อาจจะเพราะมันธรรมดาเก่า SQL-92) คุณสามารถทำลายลงนี้ในหลายขั้นตอนที่แนะนำโดย Ziggy Crueltyfree Zeitgeister, ที่นี่
CREATE TABLE sorting (sid numeric(10,10), rn int);
INSERT INTO sorting (sid, rn)
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID;
UPDATE Beleg SET SortID = (SELECT rn FROM sorting WHERE sid=Beleg.SortID)
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210;
DROP TABLE sorting;
RecordNumber? ดูเหมือนว่าฟังก์ชั่น / คุณสมบัติ Filemaker ที่เป็นกรรมสิทธิ์ ไม่ได้ใช้กับ SQL Server และไม่อยู่ในมาตรฐาน SQL 92
Filemakerดังนั้นฉันไม่คิดว่าคำตอบนั้นเกี่ยวข้อง คุณสามารถใช้ตาราง temp และเติมคอลัมน์ด้วยROW_NUMBER()ฟังก์ชั่น