2010-12-27 36 views
7

Tengo tblUsers que tiene una clave principal de ID de usuario.Error "Demasiados índices en la tabla" al crear relaciones en Microsoft Access 2010

UserID se utiliza como clave externa en muchas tablas. Dentro de una tabla, se usa como clave externa para múltiples campos (por ejemplo, ObserverID, RecorderID, CheckerID).

relaciones que he agregado con éxito (con la vista del acceso 'relación' del MS), en el que tengo que hacer alias de tabla las múltiples relaciones por mesa:

* tblUser.UserID -> 1 a muchos -> tblResight.ObserverID

* tblUser_1.UserID -> 1 a muchos -> tblResight.CheckerID

Después de crear unos 25 relaciones con la aplicación de la integridad referencial, cuando intento añadir una adicional, me sale el siguiente error :

"La operación falló. Hay demasiados índices en la tabla 'tblUsers'. Eliminar algunos de los índices de la tabla e intente la operación de nuevo."

me encontré con el código que encontré here y devuelto que tengo 6 índices en tblUsers. Sé que hay un límite de 32 índices por tabla.

¿Estoy usando incorrectamente la relación GUI? ¿El acceso crea un índice para la aplicación de la integridad referencial cada vez que creo una relación (especialmente índices que no aparecerían cuando ejecuté el script)? Estoy un poco desconcertado , se apreciará cualquier ayuda.

+0

Para mí, 25 relaciones es ridículo. Me parece que puede tener un campo repetitivo y, por lo tanto, una estructura desnormalizada. –

Respuesta

8

bien, después de hacer algunas investigaciones más, creo que tengo la respuesta a esta pregunta. Aparentemente este es un techo muy común con acceso. Voy a resumir this post Encontré a continuación:

Cada tabla solo puede tener 32 'restricciones'. Cada índice y aplicación de la integridad referencial (RI) cuenta para esto 32. MS Access crea automáticamente una restricción cuando selecciona aplicar RI; no puedes deshabilitar esta opción

Todos los snipets de código y las cosas que encontré a través de google, devolvieron que tenía seis índices sobre la mesa (y por lo tanto me estaba confundiendo). Lo que no estaba descubriendo/no sabía es que mis 25 relaciones se contabilizaron contra mis 32, porque hice cumplir a RI.

Mi solución a esto fue soltar RI en los campos de 'prioridad más baja' (me duele decir eso), y 'hacer cumplir' a través de los formularios de entrada de datos.

Básicamente, esta es una razón más por la que estoy migrando el acceso y en PostgreSQL en breve.

Si alguien tiene un mejor trabajo, me encantaría aquí. Gracias.

+1

En esta publicación parece que está usando la palabra "restricciones" cuando en realidad quiere decir "índices". RI crea índices ocultos, pero, en general, la mayoría de las tablas no se relacionan con más de un par de tablas, por lo que con un PK y, por ejemplo, 3 restricciones de clave externa, has usado solo 4 índices, dejando 28 Si tiene una tabla que realmente necesita 28 campos indexados, entonces le sugiero que mire su estructura, que bien podría estar desnormalizada. –

+3

@ David-W-Fenton: No hay razón para creer que tener más de 25 índices indica una tabla desnormalizada. De hecho, la normalización conduce a MÁS índices debido a restricciones de clave externa. El OP podría tener una tabla con 25 campos que son cada claves foráneas en 25 tablas distintas. Es bastante fácil soñar un objeto que tiene 25 propiedades diferentes e independientes que pueden representarse como índices en 25 tablas distintas, sin "pérdida de normalización".Si ese es el caso, ¿cómo sugeriría que uno se ocupa del problema? ¿Dividir la mesa en dos tablas 1: 1? No es una solución ideal. – ricovox

3

Su tabla tiene índices ocultos que se crearon cuando definió sus relaciones. Los nombres de los índices ocultos comienzan con el carácter "~". Pero el código y ou encontrado ignora índices ocultos debido a esta expresión:

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

Se podría hacer que ListIndexes() Función incluyen índices ocultos cambiando esa línea para esto:

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

Además, se puede verificar el número total de índices para su mesa con esta declaración en la ventana Inmediato:

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

Gracias HansUp, pero todos estos esencialmente me dieron la misma respuesta, seis. Después de investigar un poco más, creo que respondí mi propia pregunta. – avianattackarmada

0

Puede obtener una lista de todos los índices, incluidos los ocultos, con lo siguiente:

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 

cual da

0   PrimaryKey 
1   ProjectBusinessUnitID_6D55FF7827CC48648A15A8E576EF02EF 
2   ProjectDivisionID_9CAC7B9D8136467B97F9BAA7217EAC38 
etc 

Tenga en cuenta que si usted tiene cualquiera de los campos de varios valores en una tabla Cada uno de ellos tener un índice oculto

0

es bastante viejo, pero el problema volver muy a menudo y este hilo es lo primero en máquinas de búsqueda (alguien me dijo;))

Una buena posibilidad de superar este problema es trabajar con un "Ayudante- Tabla "para vincular a otras tablas.

Un ejemplo: Una tabla El artículo está vinculado a muchas otras tablas por diferentes motivos. También puede necesitar muchas claves foráneas para sí misma. Tal tabla sale muy a menudo de los índices posibles. También tengo tres o cuatro de ellos en mis proyectos más grandes.

Para casi duplicar las posibles RI Uniones/índices puede trabajar con una tabla auxiliar que tiene un RI 1: 1 Únase a la tabla tblArtículo con solo el Identificador Único como un Campo. Lo nombro igual no con shortletter fk delante de él como lo haría normalmente. Llamémoslo tblArticleLinker.

Cada tabla que obtiene una clave foránea de tblArticle, por ejemplo una posición de pedido, obtiene su unión de tblArticleLinker. -> No pierde un índice para todos estos enlaces, solo uno para el Linkertable

Lo único que debe asegurarse, es que siempre agrega la clave al archivo lineal al guardar, de lo contrario no es posible utilizar el registro.

Tal tabla es, desde mi experiencia, mucho más fácil de manejar que el enfoque habitual para dividir los campos en diferentes tablas. En las consultas no necesita especialmente el helpertable (a veces las consultas son más rápidas si lo hace), puede vincular directamente a la tabla. Simplemente no se hace automáticamente, como de costumbre.

Sugerencia: El mismo enfoque también se puede usar para asegurarse de que solo los registros "liberados" puedan ser utilizados por el usuario. O simplemente usar como un filtro duro. Esto ayuda a superar posibles errores de software que no siguen la lógica que deberían.

Cuestiones relacionadas