Cập nhật các hàng hiện có với số bình phương / char hoặc bất kỳ dữ liệu duy nhất nào


13

Tôi đã thêm một cột mới trong Bảng X

Cột "cn" này phải là duy nhất và bắt buộc, nhưng dữ liệu cũ không có bất kỳ giá trị nào.

Làm cách nào để cập nhật các bản ghi hiện có với dữ liệu duy nhất theo tuần tự hoặc ngẫu nhiên?

Cảm ơn bạn.

Câu trả lời:


11

Mặc dù tôi nghĩ rằng bạn đã tạo cột, nhưng trong câu trả lời này, tôi cho rằng cột này chưa tồn tại. IMO, một cột bắt buộc duy nhất không bao giờ nên được thêm vào mà không có kế hoạch làm thế nào để điền vào các hàng hiện có trước. Do đó, tôi sẽ cung cấp các phương thức để làm điều này bắt đầu từ số không.


Làm thế nào bạn làm điều này phụ thuộc vào những gì liên quan đến việc điền các giá trị.

Sau bất kỳ phương thức nào bạn sử dụng, hãy thêm một ràng buộc duy nhất trên cột để đảm bảo tính toàn vẹn dữ liệu. Đối với Phương thức 1 và 2, điều này có thể được thực hiện trong một câu lệnh hoặc trong một giao dịch người dùng (không hiển thị) và nên được thực hiện trong giao dịch người dùng trong Phương thức 3.

Có lẽ có một vài cách tối nghĩa khác để làm điều này, nhưng tôi nghĩ rằng tôi đã bao quát những cách phổ biến nhất.


Phương pháp 1: Thêm cột IDENTITY

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL

Điều này sẽ điền vào tất cả các hàng trong bảng với các giá trị nguyên bắt đầu bằng giá trị seed (1), tăng theo giá trị tăng (2) cho mỗi hàng. Tôi tin rằng thứ tự các giá trị được điền là không xác định (nếu bạn phải chỉ định một đơn đặt hàng, hãy sử dụng Phương pháp 3).


Phương pháp 2: Dân số sử dụng một ràng buộc mặc định

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())

Điều này sẽ thực hiện ba điều nguyên tử: 1. Thêm một cột không cho phép NULLcác giá trị; 2. Tạo một ràng buộc mặc định cho cột; 3. Điền từng hàng trong bảng bằng ràng buộc mặc định.

Trong khi ví dụ này sử dụng một uniqueidentifiercột, nó cũng hoạt động tốt với mọi loại dữ liệu và ràng buộc mặc định.


Phương pháp 3: Dân số bằng cách sử dụng câu lệnh CẬP NHẬT

Trường hợp này sẽ xảy ra khi, ví dụ, có một giá trị từ một phần khác trong ứng dụng của bạn cần được thêm vào bảng hoặc bạn cần chỉ định một thứ tự chính xác cho các giá trị duy nhất.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

Phương pháp 4: Dân số sử dụng một đối tượng SEQUENCE

Đối với SQL Server 2012, bạn có thể điền vào một cột bằng các giá trị được tạo bởi một SEQUENCEđối tượng - Tôi chưa làm việc với điều này, vì vậy tôi sẽ đề cập đến một bài viết MSDN cho đầy đủ.


Cảm ơn tất cả các bạn, tôi đã sử dụng phương thức 3 với sự kết hợp với câu trả lời đầu tiên: update T set cn = rn from (select cn, row_number () over (order by (select 1)) làm rn từ TableX) T
med_alpa

Ví dụ về việc sử dụng trình tự (giả sử bạn có một trình tự được gọi là kết quả):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

Nếu bạn hài lòng với một số bắt đầu từ 1, bạn có thể sử dụng row_number().

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


0

hãy thử điều này để cập nhật bằng một chuỗi ... Bạn phải thực hiện TOP vì mệnh đề theo mệnh đề trong câu lệnh cập nhật. Tôi đã sử dụng câu lệnh này trên 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

Và nếu tất cả những thứ này vẫn không hoạt động (có thể vì nó là SQL-92 cũ), bạn có thể chia nó thành nhiều bước, như đề xuất của Ziggy Crueltyfree Zeitgeister, ở đây .

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;

Đây là cái RecordNumbergì Có vẻ như một chức năng / tính năng Filemaker độc quyền. Không áp dụng cho SQL Server và không theo tiêu chuẩn SQL 92.
ypercubeᵀᴹ

Vâng bạn đã đúng. RecordNumber là một cột được tính toán mà bạn có thể xác định trong Filemaker, giữ số lượng bản ghi của mỗi hàng khi nó được hiển thị trên màn hình và sau khi được sắp xếp (bởi Filemaker).
Gary Czychi

OK, tốt, không biết điều đó. Nhưng câu hỏi ở đây không được gắn thẻ Filemakervì vậy tôi không nghĩ câu trả lời có liên quan. Bạn có thể sử dụng bảng tạm thời và điền vào cột đó với ROW_NUMBER()chức năng.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.