Câu trả lời:
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 NULL
cá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 uniqueidentifier
cộ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 đủ.
update mytable set mycolumn = next value for mysequence where mycolumn is null;
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
Cột cập nhật sau 'cn' với số thứ tự bắt đầu từ 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
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)
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;
RecordNumber
gì 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.
Filemaker
vì 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.