อัพเดตแถวที่มีอยู่ด้วยหมายเลข / ถ่านหรือข้อมูลที่ไม่ซ้ำ


13

ฉันเพิ่มคอลัมน์ใหม่ในตาราง X

คอลัมน์ "cn" นี้จะต้องไม่ซ้ำกันและจำเป็น แต่ข้อมูลเก่าไม่มีค่าใด ๆ

จะอัปเดตระเบียนที่มีอยู่ด้วยข้อมูลเฉพาะที่เป็นลำดับหรือสุ่มได้อย่างไร

ขอขอบคุณ.

คำตอบ:


11

แม้ว่าฉันคิดว่าคุณได้สร้างคอลัมน์แล้ว แต่ในคำตอบนี้ฉันคิดว่าคอลัมน์นั้นยังไม่มีอยู่ 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เพื่อความสมบูรณ์


ขอบคุณทุกคนฉันใช้วิธีที่ 3 พร้อมกับคำตอบแรก: อัปเดต T set cn = rn จาก (เลือก cn, row_number () เหนือ (เรียงตาม (เลือก 1)) เป็น rn จาก TableX) T
med_alpa

ตัวอย่างการใช้ลำดับ (สมมติว่าคุณมีลำดับที่เรียกว่า mysequence):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

หากคุณมีความสุขที่มีจำนวนตั้งแต่วันที่ 1 row_number()คุณสามารถใช้

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T


0

ลองใช้สิ่งนี้เพื่ออัปเดตโดยใช้ลำดับ ... คุณต้องทำ 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)

-1

และถ้าทั้งหมดนี้ยังจะไม่ทำงาน (อาจจะเพราะมันธรรมดาเก่า 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
ypercubeᵀᴹ

ใช่คุณพูดถูก. RecordNumber เป็นคอลัมน์จากการคำนวณที่คุณสามารถกำหนดใน Filemaker ที่เก็บหมายเลขระเบียนของแต่ละแถวเมื่อปรากฏบนหน้าจอและหลังจากนั้นจะถูกเรียงลำดับ (โดย Filemaker)
Gary Czychi

ตกลงดีไม่รู้ว่า แต่คำถามที่นี่ไม่ได้ติดแท็กด้วยFilemakerดังนั้นฉันไม่คิดว่าคำตอบนั้นเกี่ยวข้อง คุณสามารถใช้ตาราง temp และเติมคอลัมน์ด้วยROW_NUMBER()ฟังก์ชั่น
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.