CSDL_autoincrement number

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

hvnhpro

Thành viên hoạt động
Tham gia
3/3/11
Bài viết
121
Được thích
71
Giới tính
Nam
Chào các Anh/ Chị trong diễn dàn,
Bảng dữ liệu của em trong SQL Server không có cột PrimaryKey. Em đang muốn thêm 1 cột số thự tự (STT) số không trùng lặp.

Em có thử ChatGPT, và tìm trên mạng để giải quyết nhưng vẫn chưa tìm được.
Anh/Chị có giải pháp nào giúp em với.
Em cảm ơn!

Code do ChatGPT gợi ý, nhưng em thêm vào vẫn bị Lỗi trùng, do cột nào của em cũng có ít nhất 1 dòng có dữ liệu trùng
Mã:
-- Update the RandomNumber column with non-duplicate random numbers

;WITH CTE AS (

    SELECT

        MAGV, -- Replace with the column you want to use for randomness

        ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum

    FROM

        GIAOVIEN

)

UPDATE GIAOVIEN

SET RandomNumber = CTE.RowNum

FROM GIAOVIEN

JOIN CTE ON GIAOVIEN.MAGV = CTE.MAGV;

Em gửi mọi người dữ liệu em đang làm.
Mã:
    create table GIAOVIEN
    (
        MAGV nchar(3),
        HOTEN nvarchar(50),
        LUONG float,
        PHAI nchar(3),
        NGSINH date,
        DIACHI nchar(50),
        GVQLCM nchar(3),
        MABM nchar(4)
    )

    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('001',N'Nguyễn Hoài An',2000.0,N'Nam','1973-02-15',N'25/3 Lạc Long Quân, Q.10,TP HCM')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('002',N'Trần Trà Hương',2500.0,N'Nữ','1960-06-20',N'125 Trần Hưng Đạo, Q.1, TP HCM')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
    values ('003',N'Nguyễn Ngọc Ánh',2200.0,N'Nữ','1975-05-11',N'12/21 Võ Văn Ngân Thủ Đức, TP HCM',N'002')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('004',N'Trương Nam Sơn',2300.0,N'Nam','1959-06-20',N'215 Lý Thường Kiệt,TP Biên Hòa')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('005',N'Lý Hoàng Hà',2500.0,N'Nam','1954-10-23',N'22/5 Nguyễn Xí, Q.Bình Thạnh, TP HCM')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
    values ('006',N'Trần Bạch Tuyết',1500.0,N'Nữ','1980-05-20',N'127 Hùng Vương, TP Mỹ Tho',N'004')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('007',N'Nguyễn An Trung',2100.0,N'Nam','1976-06-05',N'234 3/2, TP Biên Hòa')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
    values ('008',N'Trần Trung Hiếu',1800.0,N'Nam','1977-08-06',N'22/11 Lý Thường Kiệt,TP Mỹ Tho',N'007')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
    values ('009',N'Trần Hoàng nam',2000.0,N'Nam','1975-11-22',N'234 Trấn Não,An Phú, TP HCM',N'001')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
    values ('010',N'Phạm Nam Thanh',1500.0,N'Nam','1980-12-12',N'221 Hùng Vương,Q.5, TP HCM',N'007')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('001',N'Phạm Nam Thanh',1800.0,N'Nam','1977-08-06',N'25/3 Lạc Long Quân, Q.10,TP HCM')
   
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('001',N'Trần Hoàng nam',1500.0,N'Nam','1976-06-05',N'25/3 Lạc Long Quân, Q.10,TP HCM')
    Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
    values ('002',N'Trần Trung Hiếu',2500.0,N'Nam','1960-06-20',N'125 Trần Hưng Đạo, Q.1, TP HCM')

1709803579363.png
 
Lý do tại sao phải random mà không set luôn nó là autoincrement cho khỏe?
 
Vấn đề của bạn là phải định hình hệ mã cho nhân viên trong cơ quan của mình (hướng tới 2 vạn người NV & 20 năm mà vẫn OK )
Như ví dụ:

Họ & TênMã NV
Duong Đắc DũngDFD00
Đỗ DũngFJD00
Nguyễn Anh TuấnNAT00
Ng. Ân TrungNAT01
Ngô Anh TuấnNAT02
Tr Võ Hoài NgânTHN00
Trân Hoài NamTHN01
Trần Hưng NgànTHN02
Tr. Trung HiếuTTH00
 
Vấn đề của bạn là phải định hình hệ mã cho nhân viên trong cơ quan của mình (hướng tới 2 vạn người NV & 20 năm mà vẫn OK )
...
Cách đặt này không đạt chuẩn CSDL LH (normalisation/normalization)
Theo thường lệ, CSDL nên đạt đến chuẩn bậc 3 (3rd Level Normalisation)
 
Lý do tại sao phải random mà không set luôn nó là autoincrement cho khỏe?
dạ để em thử lại theo gợi ý của Anh.
lúc đầu em thử random giống kiểu trong excel, và cũng có ý là em muốn không bị trùng ạ.
Bài đã được tự động gộp:

Vấn đề của bạn là phải định hình hệ mã cho nhân viên trong cơ quan của mình (hướng tới 2 vạn người NV & 20 năm mà vẫn OK )
Như ví dụ:

Họ & TênMã NV
Duong Đắc DũngDFD00
Đỗ DũngFJD00
Nguyễn Anh TuấnNAT00
Ng. Ân TrungNAT01
Ngô Anh TuấnNAT02
Tr Võ Hoài NgânTHN00
Trân Hoài NamTHN01
Trần Hưng NgànTHN02
Tr. Trung HiếuTTH00
dạ đúng là lúc đầu mới tạo cơ sở dữ liệu chưa có hiểu biết.
Cảm ơn Anh đã góp ý ạ
 
Em cảm ơn Anh VetMini đã hỗ trợ
Em tìm ra giải pháp rồi ạ
Mã:
-- Step 1: Add a new column with the IDENTITY property
ALTER TABLE YourTableName
ADD NewColumnName INT IDENTITY(1,1);
 
Cách đặt này không đạt chuẩn CSDL LH (normalisation/normalization)
Theo thường lệ, CSDL nên đạt đến chuẩn bậc 3 (3rd Level Normalisation)
Tôi không biết cấp 2, cấp 3 là gì nhưng cách ở bài 3 không bảo đảm không trùng với số lượng lớn khi chỉ có 2 số đuôi. Chẳng hạn như PTCxx sẽ bao gồm
- Họ Phạm, Phan, Phùng, Phong, Phú, Phiên, ... (cả chục)
- Lót Thị, Thanh, Thảo, Thiên, Tuấn, Tú, Tùng, Tuyết, Thị Thanh, Thị Tuyết, Thị Ánh, Thị Nguyên, ... (cả trăm)
- Tên Cúc, Cảo, Cao, Canh, Cân, Châu, Chánh, Chiên, Chuẩn, ... (cả trăm)
 
Tôi không biết cấp 2, cấp 3 là gì nhưng cách ở bài 3 không bảo đảm không trùng với số lượng lớn khi chỉ có 2 số đuôi. Chẳng hạn như PTCxx sẽ bao gồm
- Họ Phạm, Phan, Phùng, Phong, Phú, Phiên, ... (cả chục)
- Lót Thị, Thanh, Thảo, Thiên, Tuấn, Tú, Tùng, Tuyết, Thị Thanh, Thị Tuyết, Thị Ánh, Thị Nguyên, ... (cả trăm)
- Tên Cúc, Cảo, Cao, Canh, Cân, Châu, Chánh, Chiên, Chuẩn, ... (cả trăm)
SQL Server là phần mềm lớn. Nếu sử dụng thì admin có đủ thủ thuật để giúp db owners.
Nới rộng tầm vực vật lý của khóa chính là việc xảy ra tuy không thường xuyên nhưng cũng không hiếm lắm, admin bị nhờ giúp hoài.

Chỉ hiềm là ở GPE này, người ta hình như xem chuyện nhờ đồng nghiệp là một điều khổ nhục.
 
Nới rộng tầm vực vật lý của khóa chính là việc xảy ra tuy không thường xuyên nhưng cũng không hiếm lắm, admin bị nhờ giúp hoài.
Nhờ giúp hoài thì bị mắng hoài. Lý do là tại sao không dự trù ngay từ đầu để xài 20 năm, chẳng hạn khóa chính 10 ký tự số và là số tự tăng, mã gợi nhớ chỉ là mã phụ và chia ra vài ba cho đến năm bảy thành phần, mỗi thành phần tùy theo mức độ phức tạp của thành phần mà có số ký tự hợp lý.

Khi dùng DB lớn thì sá gì mã 10, 15 ký tự.

Mẫu:

1709870263289.png
 
. . . . . là gì nhưng cách ở bài 3 không bảo đảm không trùng với số lượng lớn khi chỉ có 2 số đuôi.
Chẳng hạn như PTCxx sẽ bao gồm
. . . .
Mình đã thử sức hệ này với hơn 4.500 HS trường cấp III, thì phần định trị chỉ tới con số 17 là tối đa;

Ngoài ra cũng nên lưu ý rằng sau 99 sẽ là A0, & khi đến ZZ sức chịu đựng của hệ thống là từ 00 → ZZ khoảng hơn ngàn mã có phần đặt tính trùng nhau.
 
Mình đã thử sức hệ này với hơn 4.500 HS trường cấp III, thì phần định trị chỉ tới con số 17 là tối đa;
Theo bạn thì với phương pháp này, áp dụng cho 4500 tên (tên là tên, mật độ vẽ trên scatter plot khác với chuỗi thông thường) sẽ có điểm trùng tối đa là 17?

Ngoài ra cũng nên lưu ý rằng sau 99 sẽ là A0, & khi đến ZZ sức chịu đựng của hệ thống là từ 00 → ZZ khoảng hơn ngàn mã có phần đặt tính trùng nhau.
Ý bạn muốn nói TVA01 và TVAA0 tên giống nhau, nhưng tên sau cách tên trước 99 người?
Mã này càng lúc càng nhiều điều kiện, khó đọc bỏ bố, dùng số như CSDL SQL Server thông thường quách.
 
Em cũng đang xem cách đặt mã của các bác thế nào.
Em theo trường phái nhìn vào mã có thể biết ngay được nội dung, giúp mình dễ hiểu.
Nếu nhìn mã toàn con số rồi tra 4, 5 bảng thế kia thì máy dễ hiểu.

Em đói quá, đi mua linh tinh về chén, thôi thì em đặt mã mẫu đây: --=0 --=0 --=0
TP-OMCBBRC80Omachi lẩu bắp bò riêu cua 80ggói
TP-VFCTB70Vifon cháo thịt bằm 70ggói
TP-CTYRBTB50Cháo tổ yến rong biển thịt bằm 50ggói
TP-VFCTM70Vifon cháo trứng muối 70ggói
TP-XXRED200Xúc xích RED 200ggói
TP-OMCTCC80Omachi tôm chua cay 80ggói
TP-BMBG220Bánh mì Baguette 220gcái
 
TP mình đoán là thực phẩm; Vậy thì chỉ có xúc xích theo mình là thực phẩm mà thôi; Còn lại thuộc nhóm mì gói nên đưa vô nhóm lương thực (LT)!
:D :D :D
Với mình thì mã nên có độ dài như nhau; Cùng lắm thì thêm 1 ký tự trời ơi nào đó như "_", . . . . cho chúng có cùng độ dài: OK?
 
Em đói quá, đi mua linh tinh về chén, thôi thì em đặt mã mẫu đây:
VFCTB70 là cháo thịt bằm Vifon 70g. Rồi nếu phát sinh thêm thịt bằm heo, thịt bằm gà, thịt bằm vịt, thịt bằm gâu gâu, ... thì sao? (Chỉ là thí dụ, không được bắt bẻ)
Rồi VFCTB70 nhưng không phải cháo thịt bằm mà là Canh Thịt Bò thì mã gì?
Đây là cách đặt mã từ thời thượng cổ, gọi là trực quan nhưng thiển cận, không có nhìn xa trông rộng.
 
TP mình đoán là thực phẩm
Chuẩn luôn bác, em thì cứ món gì đưa vào mồm thì là thực phẩm hết.
Nếu muốn phân chia thêm nhóm như bác nói thì em lại cho chạy đổi mã hàng loạt, cơ mà chưa được tối ưu, cứ Replace All nó hơi liều lĩnh quá. --=0 --=0 --=0
VFCTB70 là cháo thịt bằm Vifon 70g. Rồi nếu phát sinh thêm thịt bằm heo, thịt bằm gà, thịt bằm vịt, thịt bằm gâu gâu, ... thì sao? (Chỉ là thí dụ, không được bắt bẻ)
Rồi VFCTB70 nhưng không phải cháo thịt bằm mà là Canh Thịt Bò thì mã gì?
Đây là cách đặt mã từ thời thượng cổ, gọi là trực quan nhưng thiển cận, không có nhìn xa trông rộng.
Khi đấy thì lại phải sửa mã tiếp rồi bác, VD Bình Dương đặt mã 2 ký tự viết tắt là BD, nhưng khi gặp ông Bình Định thì phải sửa đồng loạt thành 3 ký tự là BDu và BDi. Nói chung là phải không ngừng thay đổi.

Hy vọng có phương án nào giao thoa giữa người và máy đều hiểu thì tốt nhất.
VD đi siêu thị, hôm nào mã vạch nó mờ, chị em gõ tay thấy bà nội luôn, số thì bé tẹo, nếu gõ từ khóa tắt thì tìm nhanh hơn. Nhưng cũng siêu, chị em gõ không trượt phát nào. --=0 --=0 --=0
 
. . . ., (2) em thì cứ món gì đưa vào mồm thì là thực phẩm hết.
(3) Nếu muốn phân chia thêm nhóm như bác nói thì em lại cho chạy đổi mã hàng loạt, cơ mà chưa được tối ưu, cứ Replace All nó hơi li. . . .

Khi đấy thì lại phải sửa mã tiếp rồi bác, (1) VD Bình Dương đặt mã 2 ký tự viết tắt là BD, nhưng khi gặp ông Bình Định thì phải sửa đồng loạt thành 3 ký tự là BDu và BDi. Nói chung là phải không ngừng thay đổi.
(1) Mã tỉnh theo mình nên lấy theo biển số xe của tỉnh đó; Còn lấy như thế nào thì nhường bạn!
(2) 2uá trình đưa vào mồm là 1 trong những giai đoạn của qui trình xuất kho;
Nhưng trước khi xuất kho chúng phải được nhập KHO
Ngoài chuyện mì gói nhập theo thùng nhưng xuất có thể theo thùng hay gói, còn lại xuất theo đơn vị tính của mặt hàng;
2uan trong là khi nhập hàng thì mỗi loại hàng đã phải có mã HH;
Hàng phải phân loại theo nhóm hàng, hay ngành hàng,. . . .
Như ví dụ: LT, TF như bạn đã biết, ngoài ra còn có rau, củ quả, nhiên liệu, thủy hay hải sản, . . . .
(3) Tóm lại là phải chia nhỏ ra để trị; phép chia để trị này có từ thế kỷ 18, thời Pháp thuộc lựng kia!:D :D :D
(/ui nha, nhân ngày PNQT!
 
CSDL là CSDL. Từ LH (Liên Hệ) là tính chất của một loại thiết kế CSDL.

Nhiều người không rành về CSDL LH không phân biệt được giữa Khóa (Id) và tên gọi tắt (Alias).
 
Đặt bằng số hết cho nó lành...:)

Screenshot at Mar 08 17-12-10.png
 
Thực ra với 1 qui mô nào đó mà file phục vụ ta ta có thể & tốt nhất là xài số;
Nhưng 1 số trường hợp nhỏ lẽ thì ký số cũng như ký từ ký tự qui đổi mà thôi;
Ví dụ
LT ←→ 105
TF ←→ 504
. . . .
Mong các bạn thêm ý kiến!
 
Thực ra với 1 qui mô nào đó mà file phục vụ ta ta có thể & tốt nhất là xài số;
Nhưng 1 số trường hợp nhỏ lẽ thì ký số cũng như ký từ ký tự qui đổi mà thôi;
Ví dụ
LT ←→ 105
TF ←→ 504
. . . .
Mong các bạn thêm ý kiến!
Cái điểm quan trọng nhất của mã số tự động (autoincrement) là nó chả có ý nghĩa gì cả, điểm liên hệ duy nhất của nó với cái master record là nó là con số được chứa trong trường Id của record. Và vì vậy được gọi là Id của record.
Trên nguyên tắc, nó là số hay chuỗi chả có gì quan trọng đối với người thiết kế bảng và CSDL cả.

Trên thực tế, cái chuyện đổi số thành chuỗi do phần mềm (SQL Server) tự lo lấy, người dùng như chúng ta không cần biết tới.

Chú: phần mềm có thể dùng một kiểu hash function nào đó để lập Index. Kiểu function ấy tự biết cách hash có cần chuyển mã từ số sang chuỗi hay không.
 
Web KT
Back
Top Bottom