2010-12-27 35 views
7

Tôi có người dùng tbl có khóa chính của UserID.Lỗi "Quá nhiều chỉ mục trên bảng" khi tạo mối quan hệ trong Microsoft Access 2010

UserID được sử dụng làm khóa ngoại trong nhiều bảng. Trong một bảng, nó được sử dụng như một khóa ngoại cho nhiều trường (ví dụ: ObserverID, RecorderID, CheckerID).

Tôi đã thêm thành công các mối quan hệ (với quan điểm của MS Access 'Quan hệ'), nơi tôi có bí danh bảng để làm nhiều mối quan hệ cho mỗi bảng:

* tblUser.UserID -> 1 tới nhiều -> tblResight.ObserverID

* tblUser_1.UserID -> 1 tới nhiều -> tblResight.CheckerID lỗi

sau khi tạo khoảng 25 mối quan hệ với thực thi toàn vẹn tham chiếu, khi tôi cố gắng thêm một một bổ sung, tôi nhận được như sau :

"Thao tác thất bại. Có quá nhiều chỉ mục trên bảng 'tblUsers'. Xóa một số chỉ mục trên bảng và thử lại thao tác. "

Tôi đã chạy mã tôi tìm thấy here và nó trả lại rằng tôi có 6 chỉ mục trên tblUsers. Tôi biết có giới hạn 32 chỉ mục cho mỗi bảng.

Tôi có sử dụng mối quan hệ GUI sai không? Truy cập có tạo ra chỉ mục để thực thi tính toàn vẹn tham chiếu bất kỳ lúc nào tôi tạo mối quan hệ (đặc biệt là các chỉ mục không bật lên khi tôi chạy tập lệnh) không?

+0

Với tôi, 25 mối quan hệ là vô lý. Nghe có vẻ như tôi có thể có một trường lặp lại, và do đó, một cấu trúc không chuẩn hóa. –

Trả lời

8

Được rồi, sau khi thực hiện một số nghiên cứu khác, tôi nghĩ tôi có câu trả lời cho câu hỏi này. Rõ ràng đây là một trần rất phổ biến với truy cập. Tôi sẽ tổng hợp this post Tôi tìm thấy bên dưới:

Mỗi bảng chỉ có thể có 32 'ràng buộc'. Mỗi chỉ số và thực thi tính toàn vẹn tham chiếu (RI) tính vào điều này 32. MS Access tự động tạo ra một ràng buộc khi bạn chọn để thực thi RI; bạn không thể tắt tùy chọn này.

Tất cả các mã snipets và những thứ tôi tìm thấy thông qua google, trả về rằng tôi có sáu chỉ mục trên bảng (và do đó tôi đã nhận được bối rối). Những gì tôi không tìm thấy/không biết là 25 mối quan hệ của tôi đã được tính vào 32 của tôi, bởi vì tôi đã thực thi RI.

Giải pháp của tôi cho vấn đề này là xóa RI trên các trường 'mức độ ưu tiên thấp' (nó làm tôi khó chịu khi nói), và để 'thi hành' thông qua các biểu mẫu nhập dữ liệu.

Về cơ bản, đây là một lý do nữa khiến tôi sớm chuyển sang truy cập và vào PostgreSQL.

Nếu có ai làm việc tốt hơn, tôi rất thích ở đây. Cảm ơn.

+1

Trong bài đăng này, bạn dường như đang sử dụng từ "ràng buộc" khi bạn thực sự có nghĩa là "chỉ mục". RI tạo ra các chỉ mục ẩn, nhưng, nói chung, hầu hết các bảng không liên quan đến nhiều hơn một vài hoặc ba bảng khác, do đó, với một PK và, nói, 3 hạn chế khóa ngoại, bạn đã sử dụng chỉ 4 chỉ mục, để lại 28 Nếu bạn có một bảng thực sự cần 28 trường được lập chỉ mục, thì tôi khuyên bạn nên xem xét cấu trúc của bạn, điều này có thể rất không được chuẩn hóa. –

+3

@ David-W-Fenton: Không có lý do gì để tin rằng có hơn 25 chỉ mục biểu thị một bảng không chuẩn hóa. Trong thực tế, bình thường hóa dẫn đến các chỉ mục MORE vì các ràng buộc khoá ngoại. OP có thể có một bảng với 25 trường là mỗi khóa ngoài thành 25 bảng riêng biệt. Nó khá dễ dàng để ước mơ một đối tượng có 25 thuộc tính độc lập khác nhau mà tất cả có thể được biểu diễn dưới dạng các chỉ mục thành 25 bảng riêng biệt, không có "mất bình thường hóa".Nếu đó là trường hợp, làm thế nào bạn sẽ đề nghị rằng một trong những đề với vấn đề này? Chia bảng thành hai bảng 1: 1? Không phải là một giải pháp lý tưởng. – ricovox

3

Bảng của bạn có các chỉ mục ẩn được tạo ra khi bạn xác định mối quan hệ của bạn. Tên cho chỉ mục ẩn bắt đầu bằng ký tự "~". Nhưng mã y ou tìm thấy bỏ qua chỉ số ẩn vì biểu hiện này:

If Left(tbl.Name, 4) <> "MSys" And Left(tbl.Name, 1) <> "~" Then 

Bạn có thể làm điều đó ListIndexes() chức năng bao gồm các chỉ số ẩn bằng cách thay đổi dòng này:

If Left(tbl.Name, 4) <> "MSys" Then 

Ngoài ra, bạn có thể kiểm tra tổng số các chỉ mục cho bảng của bạn với tuyên bố này trong Cửa sổ ngay lập tức:

? CurrentDb.TableDefs("tblUsers").Indexes.Count 
+0

Cảm ơn HansUp, nhưng tất cả những điều này về cơ bản vẫn cho tôi câu trả lời giống nhau, sáu. Sau khi làm một số nghiên cứu thêm, tôi nghĩ rằng tôi đã trả lời câu hỏi của riêng tôi. – avianattackarmada

0

Bạn có thể nhận được một danh sách của tất cả các chỉ số, bao gồm cả những ẩn, với những điều sau:

Sub TableListIndexes(sTableName As String, Optional bPrintFields As Boolean = False) 

    'Print indexes on a table, and fields in each index. 
    'Need to add a reference to Microsoft ADO Ext. [version] for DDL and Security (ADOX). 

    Dim cat As New ADOX.Catalog 
    Dim idxs As ADOX.Indexes 
    Dim idx As ADOX.Index 
    Dim col As ADOX.Column 
    Dim i As Integer 

    Set cat.ActiveConnection = CurrentProject.Connection 
    Set idxs = cat.Tables(sTableName).Indexes 
    For Each idx In idxs 
     Debug.Print i, idx.Name 
     If bPrintFields Then 
      For Each col In idx.Columns 
       Debug.Print , col 
      Next 
     End If 
     i = i + 1 
    Next 

End Sub 

Sub TestTableListIndexes() 
    TableListIndexes "tblProject" 
End Sub 

Mà cho

0   PrimaryKey 
1   ProjectBusinessUnitID_6D55FF7827CC48648A15A8E576EF02EF 
2   ProjectDivisionID_9CAC7B9D8136467B97F9BAA7217EAC38 
etc 

Lưu ý rằng nếu bạn có bất kỳ lĩnh vực multivalue trong một bảng mỗi sẽ có chỉ mục ẩn.

0

Nó là khá cũ, nhưng vấn đề trở lại rất thường xuyên và chủ đề này xảy ra trước trong các máy tìm kiếm (ai đó nói với tôi;))

Một khả năng tốt để khắc phục vấn đề này là làm việc với một "helper- Bảng "để liên kết với các bảng khác.

Ví dụ: Một bảng Điều được liên kết với nhiều bảng khác vì các lý do khác nhau. Ngoài ra cô ấy có thể cần rất nhiều chìa khóa nước ngoài cho chính nó. Bảng như vậy nhận được rất thường xuyên ra khỏi chỉ số có thể. Tôi cũng có ba hoặc bốn người trong số họ trong các dự án lớn nhất của tôi.

Để gần gấp đôi RI tham gia/chỉ mục bạn có thể làm việc với bảng trợ giúp có tham chiếu 1: 1 tham gia bảng tblArticle chỉ với số nhận dạng duy nhất làm trường. Tôi đặt tên nó giống nhau không phải với fk rút gọn trong Mặt trận của nó như tôi sẽ làm bình thường. Hãy gọi nó là tblArticleLinker.

Mỗi bảng nhận khóa ngoài từ tblArticle, ví dụ: Order-Position, được tham gia từ tblArticleLinker. -> Bạn không mất chỉ mục cho tất cả các liên kết này, chỉ cần một liên kết cho tất cả các liên kết này, chỉ một liên kết cho các liên kết

Điều duy nhất bạn phải đảm bảo là bạn luôn thêm khóa vào liên kết khi lưu, nếu không nó không phải là có thể sử dụng Bản ghi.

Bảng như vậy là - từ kinh nghiệm của tôi - dễ xử lý hơn cách tiếp cận thông thường để phân chia các trường trong các bảng khác nhau. Trong Truy vấn bạn không đặc biệt cần trợ giúp (đôi khi truy vấn nhanh hơn nếu bạn làm như vậy), bạn có thể liên kết trực tiếp đến bảng. Nó chỉ là không được thực hiện tự động như bình thường.

Trích dẫn: Cách tiếp cận tương tự cũng có thể được sử dụng để đảm bảo rằng chỉ người dùng mới có thể sử dụng "Bản ghi" đã phát hành. Hoặc chỉ sử dụng như một bộ lọc cứng. Điều này giúp khắc phục các lỗi phần mềm có thể không tuân theo logic mà họ cần.

Các vấn đề liên quan