SỰ NGHIỆP

Khoá chính (primary key) trong Access

Đến trả lời mới nhất
  • 0 Lượt chia sẻ
  • 14.2K Lượt đọc
  • 12 Trả lời

0 Người đang theo dõi

    • 1,769 Bài viết

    • 437 Được cảm ơn

    #1
    Mình mới bắt đầu học Access nên không hiểu lắm về khóa Primary key. Cho mình hỏi Primary key là để làm gì ? và khi nào thì cài khi nào thì không cần cài ? (vì mình thấy trong 1 table có cái cài , ví dụ như họ, tên, ngày sinh; nhưng code thành phố thì không cần cài) .

    Xin cám ơn.
    Andy Ân
  1. Đọc tiếp trên Webtretho

    • 3,779 Bài viết

    • 11,419 Được cảm ơn

    #2
    Xin mạn phép trả lời trong tầm hiểu biết của mình.

    Primary Key là khóa dùng để phân biệt các bản ghi với nhau, và đảm bảo mỗi giá trị Primary Key là duy nhất. Trong ví dụ của AndyAn thì theo mình k đúng lắm vì thường người ta k dùng họ, tên, ngày sinh làm Primary Key do những thông tin này có thể bị trùng nhau.

    Thông thường trong 1 table VD có những thông tin sau: Họ, tên, ngày sinh, code thành phố, ghi chú chẳng hạn, người ta sẽ thêm thông tin mã nhân viên và mã nhân viên này sẽ được set làm Primary Key.

    Cũng có đôi khi người ta sẽ set 1 trường mới tự động AutoID chẳng hạn làm Primary Key.
    • 807 Bài viết

    • 70 Được cảm ơn

    #3
    Trích dẫn Nguyên văn bởi AndyAn Xem bài viết
    Mình mới bắt đầu học Access nên không hiểu lắm về khóa Primary key. Cho mình hỏi Primary key là để làm gì ? và khi nào thì cài khi nào thì không cần cài ? (vì mình thấy trong 1 table có cái cài , ví dụ như họ, tên, ngày sinh; nhưng code thành phố thì không cần cài) .

    Xin cám ơn.
    Trong tất cả các hệ quản trị cơ sở dữ liệu nói chung, thì Primary key đều được sử dụng để phân biệt các bộ trong table với nhau. Nghĩa là các bộ khác nhau, thì chắc chắn phải có Primary key khác nhau.

    VD: KHi quản lý sinh viên, thì Mã sinh viên sẽ là Primary key: Đảm bảo yêu cầu, mỗi sinh viên chỉ có duy nhất 1 mã sinh viên. Ko bao giờ có chuyện 2 sinh viên khác nhau lại giống nhau về MSSV

    Việc xác định có cài primary key hay ko thì hoàn toàn phụ thuộc vào Table mà mình thiết kế. Họ, tên, ngày sinh ko thể dùng làm Primary key, vì nó ko đảm bảo tính duy nhất
    Sống như thể ngày mai phải chết!....
    • 8,389 Bài viết

    • 843 Được cảm ơn

    #4
    Trích dẫn Nguyên văn bởi AndyAn Xem bài viết
    Mình mới bắt đầu học Access nên không hiểu lắm về khóa Primary key. Cho mình hỏi Primary key là để làm gì ? và khi nào thì cài khi nào thì không cần cài ? (vì mình thấy trong 1 table có cái cài , ví dụ như họ, tên, ngày sinh; nhưng code thành phố thì không cần cài) .

    Xin cám ơn.
    Đơn giản là khóa này để phân biệt các bàn ghi với nhau để khi truy vấn dữ liệu chương trình biết để lấy thông tin
    Mỗi bảng sẽ phải có ít nhất là một trường khóa chính như vậy
    Các bảng sẽ được liên kết với nhau nhiều thông tin nhưng nó sẽ tìm và liên kết bởi trường khóa chính này
    Trong một bảng chỉ có một mã cho 1 bản ghi trong trường khóa chính, không thể trùng lặp
    • 1,769 Bài viết

    • 437 Được cảm ơn

    #5
    Oh chắc tại mới bắt đầu nên mình thấy cô cho 1 bảng danh sách ngắn và đơn giản gồm vài tên , họ, code thành phố, ngày sinh . Và cô cài khóa chính cho 2 cột họ và tên mà. Đến khi 2 cột này có tên trùng nhau thì cô cài thêm 1 khóa nữa ở cột code thành phố. Cô nói là nếu cài như thế thì sau đó mình có thể chỉnh danh sách tên họ theo alphabet được. Còn cài số thứ tự thì sau khi lập danh sách xong không sửa theo alphabet được . Không biết mình hiểu đúng không?
    Mà mình cũng thấy như các bạn nói ở trên, cài ở cột số thứ tự là logic nhất nhỉ vì stt là duy nhất rồi, đâu trùng được.

    Nhưng mìnhh vẫn không hiểu sao để cho chắc ăn không cài khóa cho mỗi cột, nếu mỗi cột đều cài thì ... có sao không ? Mà thật ra trong 1 bảng danh sách, cần cài làm gì cơ chứ, nếu sau này mình gọi 1 tên ra, nếu có trùng nhau thì cũng còn ngày tháng năm sinh hay địa chỉ, khác nhau trong hành đó mà, đâu có 2 hàng (2 người) trùng nhau hết ở mỗi cột được. Vậy thì không cài cũng ... đâu có sao . Ôi mình mù mờ quá vì mình hoc bằng tiếng Đức, đọc không hiểu thấu hết. Mà mình vào các trang VN thì dùng từ chuyên ngành mình cũng rối luôn (ví dụ như chữ "trường" , không hiểu là gì).
    Andy Ân
    • 807 Bài viết

    • 70 Được cảm ơn

    #6
    Trích dẫn Nguyên văn bởi AndyAn Xem bài viết
    Oh chắc tại mới bắt đầu nên mình thấy cô cho 1 bảng danh sách ngắn và đơn giản gồm vài tên , họ, code thành phố, ngày sinh . Và cô cài khóa chính cho 2 cột họ và tên mà. Đến khi 2 cột này có tên trùng nhau thì cô cài thêm 1 khóa nữa ở cột code thành phố. Cô nói là nếu cài như thế thì sau đó mình có thể chỉnh danh sách tên họ theo alphabet được. Còn cài số thứ tự thì sau khi lập danh sách xong không sửa theo alphabet được . Không biết mình hiểu đúng không?
    Mà mình cũng thấy như các bạn nói ở trên, cài ở cột số thứ tự là logic nhất nhỉ vì stt là duy nhất rồi, đâu trùng được.

    Nhưng mìnhh vẫn không hiểu sao để cho chắc ăn không cài khóa cho mỗi cột, nếu mỗi cột đều cài thì ... có sao không ? Mà thật ra trong 1 bảng danh sách, cần cài làm gì cơ chứ, nếu sau này mình gọi 1 tên ra, nếu có trùng nhau thì cũng còn ngày tháng năm sinh hay địa chỉ, khác nhau trong hành đó mà, đâu có 2 hàng (2 người) trùng nhau hết ở mỗi cột được. Vậy thì không cài cũng ... đâu có sao . Ôi mình mù mờ quá vì mình hoc bằng tiếng Đức, đọc không hiểu thấu hết. Mà mình vào các trang VN thì dùng từ chuyên ngành mình cũng rối luôn (ví dụ như chữ "trường" , không hiểu là gì).

    1 phần vì chị mới học, 1 phần vì cô giáo chị dạy .... lúa quá!


    Oh chắc tại mới bắt đầu nên mình thấy cô cho 1 bảng danh sách ngắn và đơn giản gồm vài tên , họ, code thành phố, ngày sinh . Và cô cài khóa chính cho 2 cột họ và tên mà. Đến khi 2 cột này có tên trùng nhau thì cô cài thêm 1 khóa nữa ở cột code thành phố. Cô nói là nếu cài như thế thì sau đó mình có thể chỉnh danh sách tên họ theo alphabet được. Còn cài số thứ tự thì sau khi lập danh sách xong không sửa theo alphabet được . Không biết mình hiểu đúng không?
    Ko ai sử dụng Họ tên + Code thành phố làm khóa chính cả (Trừ cái cô giáo kì cục đó ), hình dung đơn giản ngoài thực tế: HCM & HN có bao nhiêu người cùng tên Phạm Đăng Khoa? Mà nguyên tắc lưu trữ là tuyệt đối ko có những bộ dữ liệu khác nhau khi khóa chính giống nhau => Có thể trong bảng dữ liệu (1 vài record) của cô giáo chị lấy ra làm ví dụ, thì khóa đó sẽ đúng, nhưng mà thực tế áp dụng thì nó sai bét
    Cũng với ví dụ đó, người ta sẽ quản lý bằng "Mã" (VD: với sinh viên thì là Mã SV, với nhâu khẩu thì là Số CMND, với nhân viên công ty thì là Mã nhân viên .... đảm bảo tính duy nhất)


    Mà mình cũng thấy như các bạn nói ở trên, cài ở cột số thứ tự là logic nhất nhỉ vì stt là duy nhất rồi, đâu trùng được.
    Số thứ tự cũng là 1 dạng biến hóa của Mã như e vừa nói ở trên thôi, nhưng ko phải đánh số thứ tự = cách thông thường (1,2,3,4....n), mà trong số thứ tự đó sẽ phải bao gồm thêm 1 thông tin gì đó:
    VD:
    Số điện thoại: 0901234567 : Nhìn vào 3 số đầu là ta biết của mạng điện thoại nào

    Số CMND: 151123456: Nhìn vào 3 số đầu là biết CMND đó thuộc tỉnh nào ....


    [quote]Nhưng mìnhh vẫn không hiểu sao để cho chắc ăn không cài khóa cho mỗi cột, nếu mỗi cột đều cài thì ... có sao không [/quote

    Chắc ăn thì chắc ăn thật, nhưng mà nó vi phạm định nghĩa của Primary key. Hơn nữa, với 1 bộ cơ sở dữ liệu lớn, thì cách truy xuất này sẽ giết chết Server đấy ạ


    Mà thật ra trong 1 bảng danh sách, cần cài làm gì cơ chứ, nếu sau này mình gọi 1 tên ra, nếu có trùng nhau thì cũng còn ngày tháng năm sinh hay địa chỉ, khác nhau trong hành đó mà, đâu có 2 hàng (2 người) trùng nhau hết ở mỗi cột được. Vậy thì không cài cũng ... đâu có sao .
    Đúng là có những trường hợp ko cần cài khóa chính như chị nói, nhưng để xử lý được các thông tin truy xuất đó lại là cả 1 vấn đề.

    Vấn đề 1:Nếu như chị nói, thì chị chỉ có thể xử lý thông tin lấy ra = tư duy của con ngườii, chứ đưa vào chương trình để nó xử lý thì bó tay.
    Vấn đề 2: khi truy xuất dữ liệu ko khóa: Vẫn lấy VD là quản lý nhân khẩu, bây giờ có 1 ng nào đó muốn xem thông tin hộ khẩu của em:
    - Nếu quản lý = khóa chính (Số CMND), thì gõ số CMND => Ok => Ra được 1 record duy nhất là em
    - Nếu ko có khóa chính: Giả sử trong khoảng hơn 80tr dân số VN, có khoảng 1000 ng cùng tên "Phạm Đăng Khoa" => Chị ngồi đó lần mò ra được đúng là em cũng bở hơi tai , chưa kể đến việc, hiện ra 1000 recode thì cái máy có khi nó cũng treo cứng
    Vấn đề 3: Truy xuất dữ liệu của Database Server, khi xử lý bảng ko khóa chính, thì nó sẽ phải search mọi hàng & mọi cột => Tài nguyên tiêu tốn là nhiều vô kể

    ==> Túm lại là phải có khóa chính & ko lấy ví dụ về khóa chính giống như cô giáo của chị
    Sống như thể ngày mai phải chết!....
    • 807 Bài viết

    • 70 Được cảm ơn

    #7
    Quên, nói thêm, kinh nghiệm của e là ko nên sử dụng những từ dịch tiếng Việt dịch ra từ các từ chuyên ngành (Nghe còn khó hiểu hơn là dùng chính từ đó )
    Sống như thể ngày mai phải chết!....
    • 657 Bài viết

    • 179 Được cảm ơn

    #8
    Khóa chính có thể là :
    -1 trường (VD : Số HC, Số CMDD...)
    -Hoặc tập hợp các trường (Họ + Tên + Ngày Sinh + Địa Phương+...)
    Với điều kiện trong 1 bảng, thì khóa chính chỉ là duy nhất .

    Tóm lại với khóa chính trong 1 bảng không có 2 bộ dữ liệu khóa chính giống hệt nhau .

    Tức là có thể là (Họ + Tên) -> Bộ Khóa chính -> Không sai, chỉ là sẽ có khả năng trùng nhau, chứ không sai .
    Minh Châu :1: Minh Ngọc

    • 807 Bài viết

    • 70 Được cảm ơn

    #9
    Trích dẫn Nguyên văn bởi boutit Xem bài viết
    Khóa chính có thể là :
    -1 trường (VD : Số HC, Số CMDD...)
    -Hoặc tập hợp các trường (Họ + Tên + Ngày Sinh + Địa Phương+...)
    Với điều kiện trong 1 bảng, thì khóa chính chỉ là duy nhất .
    Chính xác là như thế! Tuy nhiên, đoạn này của bác lại mâu thuẫn với đoạn sau:
    Trích dẫn Nguyên văn bởi boutit
    Tức là có thể là (Họ + Tên) -> Bộ Khóa chính -> Không sai, chỉ là sẽ có khả năng trùng nhau, chứ không sai .
    [/quote]

    Trường hợp trùng nhau đó chính là đã vi phạm vào khóa chính rồi: Khóa chính giống nhau, nhưng bộ dữ liệu khác nhau => Vi phạm
    Sống như thể ngày mai phải chết!....
    • 657 Bài viết

    • 179 Được cảm ơn

    #10
    Trích dẫn Nguyên văn bởi khoabeo108 Xem bài viết
    Chính xác là như thế! Tuy nhiên, đoạn này của bác lại mâu thuẫn với đoạn sau:
    Trường hợp trùng nhau đó chính là đã vi phạm vào khóa chính rồi: Khóa chính giống nhau, nhưng bộ dữ liệu khác nhau => Vi phạm[/QUOTE]

    Không vi phạm , có thể nó trùng nhau chỉ khi nhập dữ liệu mới xảy ra . Nếu nhập dữ liệu xảy ra lỗi (khóa chính không chấp nhận nhập trùng dữ liệu)-> Cần thay đổi bộ khóa chính -> Sẽ thêm trường [Năm Sinh] vào để mở rộng bộ khóa chính-> có thể nhập tiếp dữ liệu -> Vẫn có thể trùng -> Thay đổi tiếp bộ khóa chính bằng cách thêm trường [Địa Phương] đó cũng chỉ là 1 cách làm tạm thời .
    Giải pháp triệt để là chương trình tự tạo ra số tự nhiên tăng để làm khóa chính, luôn tăng thì sẽ không trùng , chứ nếu lấy ID (không tự động sinh ra từ chương trình) cũng chỉ nhập dữ liệu bằng tay -> Vẫn có thể trùng số ID .

    Nếu bạn đã học lập trình thì vấn đề này trong bài Cơ Sở Dữ Liệu có nói khá kỹ . Nếu đã từ làm phân tích thiết kế hệ thông CSDL thì càng va vấp nhiều hơn .
    Minh Châu :1: Minh Ngọc

    • 807 Bài viết

    • 70 Được cảm ơn

    #11
    Trích dẫn Nguyên văn bởi boutit Xem bài viết
    Không vi phạm , có thể nó trùng nhau chỉ khi nhập dữ liệu mới xảy ra . Nếu nhập dữ liệu xảy ra lỗi (khóa chính không chấp nhận nhập trùng dữ liệu)-> Cần thay đổi bộ khóa chính -> Sẽ thêm trường [Năm Sinh] vào để mở rộng bộ khóa chính-> có thể nhập tiếp dữ liệu -> Vẫn có thể trùng -> Thay đổi tiếp bộ khóa chính bằng cách thêm trường [Địa Phương] đó cũng chỉ là 1 cách làm tạm thời .
    Giải pháp triệt để là chương trình tự tạo ra số tự nhiên tăng để làm khóa chính, luôn tăng thì sẽ không trùng , chứ nếu lấy ID (không tự động sinh ra từ chương trình) cũng chỉ nhập dữ liệu bằng tay -> Vẫn có thể trùng số ID .

    Nếu bạn đã học lập trình thì vấn đề này trong bài Cơ Sở Dữ Liệu có nói khá kỹ . Nếu đã từ làm phân tích thiết kế hệ thông CSDL thì càng va vấp nhiều hơn .
    Thôi, thiết kế CSDL mà đến khi nhập chương trình, phát hiện ra khóa chính ko toàn vẹn, lại tiếp tục sửa, lại tiếp tục nhập, lại phát hiện, lại tiếp tục sửa thế này thì .... e thua 100% :Smiling:

    Không biết, với 1 hệ quản trị cơ sở dữ liệu lớn, 1 chương trình truy xuất giành cho Client được viết hoàn chỉnh, bản quyền đã giao, rồi vài ngày khách hàng lại phải lôi công ty lập trình tới để sửa khóa, sửa code (Mà sửa khóa, sửa code xong thì lại phải giai đoạn chạy demo, giai đoạn đóng gói, rồi giai đoạn giao nhận) thế này? Thì thế nào ạ?


    Giải pháp triệt để là chương trình tự tạo ra số tự nhiên tăng để làm khóa chính, luôn tăng thì sẽ không trùng , chứ nếu lấy ID (không tự động sinh ra từ chương trình) cũng chỉ nhập dữ liệu bằng tay -> Vẫn có thể trùng số ID .
    Cái này thì lại càng sai ạ, giải thích cái này dài dòng + rắc rối tí, hơn nữa nó lại đi lệch sang chủ để Primary key 1 chút, nên e ko giải thích ở đây.


    Nếu bạn đã học lập trình thì vấn đề này trong bài Cơ Sở Dữ Liệu có nói khá kỹ . Nếu đã từ làm phân tích thiết kế hệ thông CSDL thì càng va vấp nhiều hơn
    Ko, khi học lập trình thì ko thầy nào nói với em cả. Nhưng khi học mấy môn dạng như: Nhập môn CSDL, Thiết kế CSDL, Hệ Quản trị CSDL, Phân tích thiết kế hệ thống. Thì mới thấy việc xác định khóa chính như vậy .... thật là lạ
    Sống như thể ngày mai phải chết!....
    • 657 Bài viết

    • 179 Được cảm ơn

    #12
    Trích dẫn Nguyên văn bởi khoabeo108 Xem bài viết
    Thôi, thiết kế CSDL mà đến khi nhập chương trình, phát hiện ra khóa chính ko toàn vẹn, lại tiếp tục sửa, lại tiếp tục nhập, lại phát hiện, lại tiếp tục sửa thế này thì .... e thua 100% :Smiling:

    Không biết, với 1 hệ quản trị cơ sở dữ liệu lớn, 1 chương trình truy xuất giành cho Client được viết hoàn chỉnh, bản quyền đã giao, rồi vài ngày khách hàng lại phải lôi công ty lập trình tới để sửa khóa, sửa code (Mà sửa khóa, sửa code xong thì lại phải giai đoạn chạy demo, giai đoạn đóng gói, rồi giai đoạn giao nhận) thế này? Thì thế nào ạ?
    Đang nói trong Access để bạn dễ hiểu là tại sao có kiểu dữ liệu Auto Number trong Access, cái đó có thể dùng làm khóa chính đó bạn . Mình nó là chương trình tự sinh , tức là kiểu Auto Number khi thiết kế, với kiểu này không lo trùng khóa . Thường có thể dùng trường Auto Number làm khóa chính . Các bộ khóa khác cũng có thể tự tạo ra để sắp xếp, tìm kiếm dữ liệu nhanh hơn .

    Việc tranh luận ở đây liên quan đến cty phát triển ừng dụng thì lại khác bạn ah . Ở đây nói phần kỹ thuật, tính logic của chương trình thôi mà. Còn nếu làm thực tế thì phải có "Phân tích, thiết kế, tranh luận" rất kỹ về CSDL (bảng, trường, khoá, liên kết 1-1 , 1-nhiều, nhiều-1,nhiều-nhiều,...) trước khi phát triển ứng dụng .

    Ý mình trong các bài trên là tất nhiên khi làm thực tế không ai kết hợp các trường Tên + Họ để thành khóa chính , nhưng khi học tập bạn vẫn có thể thực hiện bài tập như thế .
    Minh Châu :1: Minh Ngọc

    • 12,364 Bài viết

    • 16,073 Được cảm ơn

    #13
    Trích dẫn Nguyên văn bởi boutit Xem bài viết
    Đang nói trong Access để bạn dễ hiểu là tại sao có kiểu dữ liệu Auto Number trong Access, cái đó có thể dùng làm khóa chính đó bạn . Mình nó là chương trình tự sinh , tức là kiểu Auto Number khi thiết kế, với kiểu này không lo trùng khóa . Thường có thể dùng trường Auto Number làm khóa chính . Các bộ khóa khác cũng có thể tự tạo ra để sắp xếp, tìm kiếm dữ liệu nhanh hơn .
    Đúng rồi, làm tron Access thì cứ cái đó mà xài.
    Đố ông/bà boutit: Có khi nào thì nên xài 2 cột AutoNum ?

    @#: Đôi khi có bảng chả cần khóa chính, cũng chả sao, có điều ... không thiết lập được quan hệ (relation) và ... không "thỏa mãn" cô giáo dạy môn CSDL "Quan hệ"
    Ăn được, ngủ được là Tiên