Tin Học - Công nghệ

Khoá chính (primary key) trong Access

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

0 Người đang theo dõi

  • Trang 1/2

    Chuyển tới trang

  • 1
  • 2
    • 1,768 Bài viết

    • 433 Đượ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

    • 3,775 Bài viết

    • 11,396 Đượ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

    • 842 Đượ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,768 Bài viết

    • 433 Đượ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!....

    • 653 Bài viết

    • 175 Đượ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!....

    • 653 Bài viết

    • 175 Đượ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


  • Trang 1/2

    Chuyển tới trang

  • 1
  • 2