Về khóa chính không bắt đầu từ 1

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

Pavami

Thành viên mới
Tham gia
31/10/23
Bài viết
2
Được thích
0
Trong trường hợp này mình muốn đặt khóa chính bắt đầu đếm từ 52 thì làm thế nào vậy mọi người?
1698753886641.png1698762894526.png
 
Lần chỉnh sửa cuối:
Mỗi loại CSDL có cách làm khác nhau. Bạn nghĩ là người khác nhìn hình có thể đoán ra bạn đang dùng loại nào à?
 
Xóa 51 record đầu là được. Bất kể CSDL nào :p :p
 
Lập trường khác rồi đổi lại là được.
 
Bạn chuyển kiểu dữ liệu về dạng số nguyên long/int..., rồi UPDATE [Bảng 1] SET [Mã số]=[Mã số]+51
 
Lập trường khác rồi đổi lại là được.
Trong access không thể đổi 1 trường đã có dữ liệu thành kiểu AutoNumber
Bạn chuyển kiểu dữ liệu về dạng số nguyên long/int..., rồi UPDATE [Bảng 1] SET [Mã số]=[Mã số]+51
Update xong không chuyển về kiểu AutoNumber được.

Kiểu Number thông thường không tự tăng.
 
Trong access không thể đổi 1 trường đã có dữ liệu thành kiểu AutoNumber

Update xong không chuyển về kiểu AutoNumber được.

Kiểu Number thông thường không tự tăng
Vì người mở chủ đề không yêu cầu bắt buộc phải là "Auto number" nên tôi gợi ý thế thôi. Vấn đề này tôi từng giải quyết nên cũng chả lạ gì.
Còn trường hợp đang dùng trường số mà muốn chuyển về "Auto number" thì cũng chỉ cần 1 câu SQL dạng cơ bản mà không cần nhập liệu lại từ đầu, hiển nhiên là không thể dùng lại bảng cũ. Tôi vừa thử xong trên Access đây.
 
Lần chỉnh sửa cuối:
Theo như hình chụp thì bảng đã có dữ liệu chính thức 13 dòng.
Nhập dữ liệu giả thật đơn giản cho nhanh, chỉ để lấy ID đến 51.
Copy 13 dòng
click chọn dòng {New) và paste
Xóa 51 dòng trên

Cách này nhanh và dễ, đồng thời sử dụng được bảng cũ.
 
Vì người mở chủ đề không yêu cầu bắt buộc phải là "Auto number" nên tôi gợi ý thế thôi. Vấn đề này tôi từng giải quyết nên cũng chả lạ gì.
Nếu không phải autonumber từ đầu thì có thể sửa tay, hoặc update bằng SQL mà không cần đổi kiểu long/ integer
 
Nếu anh/chị nào giống tôi luôn suy nghĩ là bọn Tây không ngừng tạo ra những thứ mới mẻ, thỏa mãn những nhu cầu hợp lý thì sẽ search ra một câu SQL cực kỳ hay ho, đủ đáp ứng ngay từ đầu mong muốn của người mở topic.
SQL:
CREATE TABLE TableThatIncrements
(
Id AUTOINCREMENT(1001,1)
)
Tôi đã thử trên Access và một lần nữa phải lác mắt với mấy anh Tây. :wow:
 
Lần chỉnh sửa cuối:
Muốn dùng code
[mã số] = [mã số] + 51
thì phải sắp xếp lớn xuống nhỏ
Nếu không sẽ bị lỗi trùng khóa.

Theo như hình chụp thì bảng đã có dữ liệu chính thức 13 dòng.
Nhập dữ liệu giả thật đơn giản cho nhanh, chỉ để lấy ID đến 51.
Copy 13 dòng
click chọn dòng {New) và paste
Xóa 51 dòng trên

Cách này nhanh và dễ, đồng thời sử dụng được bảng cũ.
Tự trong Table View thì không được. Nhưng có thể đổi một trường mới qua SQL View
- Đổi trường ID thành Number
- Tạo một trường AutoIncrement mới nuID
- Vào SQL View, dùng command tạo một trường AutoIncrement mới nuID (52,1)
- Copy dữ liệu từ lớp cũ sang lớp mới.
- Xóa lớp cũ
- Rename các tên trường
- Tìm những tables có liên hệ đến key này, và chỉnh chúng
 
Muốn dùng code
[mã số] = [mã số] + 51
thì phải sắp xếp lớn xuống nhỏ
Nếu không sẽ bị lỗi trùng khóa.
Nếu số dòng dữ liệu ít hơn 52 (giống như trên hình) thì câu UPDATE của tôi vẫn chạy đúng nhé. Còn trong trường hợp khác thì dù sắp xếp thì chạy lệnh UPDATE tương tự như thế vẫn có thể lỗi tè le.
 
Muốn dùng code
[mã số] = [mã số] + 51
thì phải sắp xếp lớn xuống nhỏ
Nếu không sẽ bị lỗi trùng khóa.
Dù trùng hay không trùng thì cách này không dùng được, vì update table xong không chuyển thành autonumber được.
- Nếu dưới 51 dòng: Làm như bài 9, vẽ lung tung cho đủ 51
- Nếu trên 51 dòng: Copy 51 dòng đầu paste xuống dưới rồi xóa 51 dòng đầu.
Dùng lại bảng này mà không cần tạo bảng mới, không cần đổi kiểu number, không cần chuyển dữ liệu qua, không cần đổi tên trường, không cần xóa bảng cũ, ...
 
- Nếu trên 51 dòng: Copy 51 dòng đầu paste xuống dưới rồi xóa 51 dòng đầu.
Dùng lại bảng này mà không cần tạo bảng mới, không cần đổi kiểu number, không cần chuyển dữ liệu qua, không cần đổi tên trường, không cần xóa bảng cũ, ...
Cảm giác có gì đó bất thường với ý kiến trên nên tôi đã thực nghiệm và phát hiện ra là... (các anh/chị cứ thử sẽ rõ)
Giả sử dữ liệu nhiều hơn 51 dòng, chẳng hạn đã có sẵn 60 dòng thì áp dụng cách này liệu có đúng không nhỉ? Có vẻ người đưa lý thuyết đồng nhất Access với Excel nên không hề có sự thực nghiệm. Hiển nhiên là vẫn có cách để tận dụng dữ liệu cũ nhưng chắc chắn là không đơn giản như phương án nêu trên
 
Lần chỉnh sửa cuối:
Cảm giác có gì đó bất thường với ý kiến trên nên tôi đã thực nghiệm và phát hiện ra là... (các anh/chị cứ thử sẽ rõ)
Tôi luôn luôn thực nghiệm trước khi viết bài. Kể cả kết luận trường number đã có dữ liệu không chuyển thành autonumber được (bài 7) cũng là đã thực nghiệm kỹ. Tôi tự hào là người luôn thực nghiệm trước khi trả lời bất kỳ việc gì, dù nhỏ như là 1 công thức SUM.

Cách copy paste khi nhiều hơn 51 dòng, hay ít hơn 51 dòng, tôi cũng đã thực nghiệm. Và tôi cũng ngạc nhiên cho 1 vị cũng uyên thâm mà thực nghiệm không ra.

Chẳng hạn tôi thực nghiệm cho mong muốn ID bắt đầu từ 11.

Trường hợp có sẵn 5 dòng: vẽ nhăng cuội cho đủ 10

1698858177065.png 1698858223671.png 1698858314484.png

Trường hợp dữ liệu có sẵn 24 dòng. Copy 10 dòng đầu và paste xuống dưới, sau đó xóa 10 dòng đầu:

1698857761903.png ______1698857844740.png
 
Tôi thường
Tôi luôn luôn thực nghiệm trước khi viết bài. Kể cả kết luận trường number đã có dữ liệu không chuyển thành autonumber được (bài 7) cũng là đã thực nghiệm kỹ. Tôi tự hào là người luôn thực nghiệm trước khi trả lời bất kỳ việc gì, dù nhỏ như là 1 công thức SUM.
Nếu chưa chắc chắn, tôi cũng phải kiểm nghiệm ý tưởng trước khi comment nhưng tôi chả có cảm giác tự hào gì với những kiến thức phổ thông trên mạng.

Chẳng hạn tôi thực nghiệm cho mong muốn ID bắt đầu từ 11.
Trường hợp dữ liệu có sẵn 24 dòng. Copy 10 dòng đầu và paste xuống dưới, sau đó xóa 10 dòng đầu:

View attachment 296285 ______View attachment 296286
Theo yêu cầu giả định (ID bắt đầu từ 11), đáng ra kết quả sau thủ thuật phải là 11-b01, 12-b02...34-b24 chứ sao lại là 11-b11, 12-b12...34-b10 như trong hình minh họa kết quả của ptm0412 được nhỉ?
 
Lần chỉnh sửa cuối:
Trong trường hợp này mình muốn đặt khóa chính bắt đầu đếm từ 52 thì làm thế nào vậy mọi người?
View attachment 296268View attachment 296270
Mục đích chuyển mã số của bạn là gì?
Khóa chính theo dạng "Auto number" dùng nhận dạng khác nhau của từng dòng và thứ tự nhập liệu, không nên dùng nó làm "Mã số" thực sự để nhận diện từng người
 
Mục đích chuyển mã số của bạn là gì?
Khóa chính theo dạng "Auto number" dùng nhận dạng khác nhau của từng dòng và thứ tự nhập liệu, không nên dùng nó làm "Mã số" thực sự để nhận diện từng người
Khóa chính mà có ý nghĩa gì đó thì là phản chuẩn (normalisation).
Trên nguyên tắc CSDL liên hệ, khóa chính không được mang ý nghĩa gì hết (kể cả thứ tự nhập liệu). Nó chỉ dùng để nhận diện dòng (bởi vậy nó thường được mặc định cái tên ID). Và những gì liên hệ đến dòng X sẽ có cái trường liên hệ mang trị X.

Ở bài #12, câu cuối tôi có nói là "tìm những chỗ liên hệ đến trường này và chỉnh chúng".
Tôi không hỏi mục đích thớt bởi vì tôi nghĩ có thể thớt bị lỗi trợt trường liên hệ. Ví dụ bảng 1 chứa ID, bảng 2 có trường bang1_ID, đáng lẽ mang số 5 thì nó mang số 56. Bây giờ nếu chỉnh cái trường ấy thì cũng dễ. Nhưng nếu có nhiều bảng bị vậy thì người ta cho rằng chỉnh cái bảng chính dễ hơn.

Thực tế, lúc bị trợt trường (có thể vì một code VBA nào đó viết bậy, hay cái Event nạp trường kẹt, hổng chạy,...) thì bản thân tôi thà sửa chục cái bảng liên hệ còn hơn sửa khóa bảng chính. Vừa rắc rối vừa để họa sau này.
 
Có một việc mà tôi đợi để nói với tác giả bài 1, nhưng thôi nói luôn:
- Trường autonumber chả có ý nghĩa gì về mặt dữ liệu (không chứa thông tin), nó cũng không hiện diện trên form nhập liệu, báo cáo. Người dùng cuối có khi còn không biết đến sự tồn tại của nó. Vậy thì dù nó là bao nhiêu cũng chẳng cần biết làm gì.
- Đối với các bảng danh mục thì khóa chính nên là mã của danh mục chứ không phải con số tăng kia (mã vật tư, mã nhân viên, mã phòng ban, ...), để khi nhập liệu nó hiển thị có hình tượng cho người dùng. Và những mã này (duy nhất ở từng bảng danh mục) mới dùng để tạo quan hệ với những bảng dữ liệu khác.

Không trông chờ được vào việc kiểm soát số tăng, vì nó hoàn toàn tự động. Như sau:
- Nếu xóa 1 record mang số ID nào đó, thì số đó mất vĩnh viễn, những số ở dưới không đôn lên. Thì không còn tính liên tục để nhìn cho đẹp mắt.
- Nếu 1 chứng từ có 3 record, ID là 40, 41, 42. Sau đó (sau khi nhập liệu thêm cả đống) phát hiện thiếu và chỉnh sửa thêm 1 record thì đừng trông chờ rằng record mới sẽ mang số 43 mà sẽ là số khác lớn hơn. Kết quả là 1 chứng từ 4 record mang số 40, 41, 42, 101.
- Nếu xóa một vài record cuối chẳng hạn xóa 2 record mang ID 99 và 100, thì khi nhập liệu thêm, ID tiếp theo sẽ vẫn là 101 chứ đừng mong rằng Access lấy số cuối (98) tăng 1. Nó đã ghi nhớ rằng 2 con đó đã xài và không cho xài nữa.

Vậy thì theo cách ở bài 16 copy ở trên paste xuống dưới ID vẫn bắt đầu bằng 11 nhưng dòng dữ liệu nhập vào đầu tiên hồi năm ngoái sẽ mang số 25 (như phát hiện của bài 17). Tôi không quan tâm vì yêu cầu chỉ nói về ID bắt đầu từ 52 chứ không nói gì về nguyên dòng dữ liệu đầu tiên phải mang số 52.

Và theo tôi thì nó mang số 52 hay 152 hay 1000 chả ảnh hưởng gì đến việc nhập liệu, ra báo cáo, ....

Tất nhiên tôi đưa ra giải pháp thì tác giả có quyền chọn cách nào họ thấy là phù hợp, hoặc đơn giản là chỉ thích, chứ tôi cũng không mong cầu gì họ làm theo những gì tôi viết ở trên.
 
Web KT
Back
Top Bottom