|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Нужно ли создавать индексы по колонкам, по которым построен внешний ключ (для Access) ? Для пояснения приведу простейший пример: есть таблица MASTER с полями ID (первичный ключ) и NAME, таблица SLAVE с полями ID (первичный ключ), PARENT_ID (внешний ключ на MASTER.ID) и NAME. Так вот вопрос в том, нужен ли индекс по полю SLAVE.PARENT_ID (считаем, что поле PARENT_ID (и только оно) активно используется в запросах) ? Я досих пор считал, что индекс нужен. Сегодня прогнал эту тестовую базу (из двух таблиц) через Visio и получил предупреждение: warning L4001: 'MASTERSLAVE' : Index on table 'SLAVE' and Index 'PARENT_ID' (on same table) are identical. Получается, что Access автоматически создал индекс, когда создавался внешний ключ ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2004, 15:52 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Получается, что Access автоматически создал индекс, когда создавался внешний ключ ? Да ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2004, 15:58 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
по умолчанию создает и не только для внешних ключей эту фичу можно отключить ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2004, 16:59 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
vizioпо умолчанию создает и не только для внешних ключей эту фичу можно отключить А где можно отключить создание индекса для внешнего ключа? Просветите, а то ограничение в 32 индекса на одну таблицу вынуждают меня создавать таблицы-призраки (копии) для поддержки целостности базы (база порядка 300 таблиц, технология предусматривает схему в виде звезды, т.е. огромное количество табиц являются подчиненными для одной таблицы). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2004, 18:16 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
не очень понял проблему индексы ведь всегда можно удалить другое дело, что соответствующие запросы тормозить начнут а вообще, по-видимому, дело не во внешних ключах, а в названиях столбцов по умолчанию, если имя столбца начинается с или заканчивается на "ID;key;code;num", то создается индекс менять эту настройку можно в "Tools -> Options -> Tables/Queries -> AutoIndex on Import/Create" если проблема действительно связана с внешними ключами, то объясни подробнее ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 09:26 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
2 Д.Проценко А где можно отключить создание индекса для внешнего ключа? Читаем хелп по Alter Table, предложение Constraint: RTFMCONSTRAINT имя {PRIMARY KEY (ключевое_1[, ключевое_2 [, ...]]) | UNIQUE (уникальное_1[, уникальное_2 [, ...]]) | NOT NULL (непустое_1[, непустое_2 [, ...]]) | FOREIGN KEY [NO INDEX] (ссылка_1[, ссылка_2 [, ...]]) REFERENCES внешняяТаблица [(внешнееПоле_1 [, внешнееПоле_2 [, ...]])] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]} ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 09:33 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Лох Позорный2 Д.Проценко А где можно отключить создание индекса для внешнего ключа? Читаем хелп по Alter Table, предложение Constraint: RTFMCONSTRAINT имя {PRIMARY KEY (ключевое_1[, ключевое_2 [, ...]]) | UNIQUE (уникальное_1[, уникальное_2 [, ...]]) | NOT NULL (непустое_1[, непустое_2 [, ...]]) | FOREIGN KEY [NO INDEX] (ссылка_1[, ссылка_2 [, ...]]) REFERENCES внешняяТаблица [(внешнееПоле_1 [, внешнееПоле_2 [, ...]])] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]} Читаем хелп внимательно: Примечание. Ядро базы данных Microsoft Jet не поддерживает использование инструкции CONSTRAINT и любых других инструкций языка описания данных (DDL) с базами данных, не основанными на Microsoft Jet. В таких базах данных следует применять методы Create для объектов DAO. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 10:48 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Пардон, сам не внимателен: Примечание. Ядро базы данных Microsoft Jet не поддерживает использование инструкции CONSTRAINT и любых других инструкций языка описания данных (DDL) с базами данных, не основанными на Microsoft Jet. В таких базах данных следует применять методы Create для объектов DAO. Так, что нужно попробовать, как немного освобожусь ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 10:49 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Конструкция FOREIGN KEY NO INDEX к сожалению не поддерживается в БД Jet (mdb) ни в 97, ни в 2000, ни в 2003 формате. (на NO следует сообщение "Ошибка синтаксиса в предложении CONSTRAINT". Так, что дядя Бил, нас видимо в очередной раз обманул. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:08 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
А SQL-92 кто будет включать? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:13 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Да, если включить опцию и создать запрос "ALTER TABLE tblMain ADD CONSTRAINT Ind01 FOREIGN KEY NO INDEX (Id) REFERENCES Sub01 (Ref)", то работает, а вот такой код не работает :( (все таблицы в наличии) Sub aaa() Const str1 = "ALTER TABLE tblMain ADD CONSTRAINT Ind" Const str2 = " FOREIGN KEY NO INDEX (Id) REFERENCES Sub" Const str3 = " (Ref)" Dim i As Long Dim strQ As String For i = 1 To 35 strQ = str1 & Format(i, "00") & str2 & Format(i, "00") & str3 CurrentDb().Execute strQ Next End Sub ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:22 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
хм... а ты уверен, что ты в правильную сторону связи строишь? З.Ы. а вот такой код не работает очень, очень печально но телепяты в отпуске. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:29 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Так я же привел весь код: Д.ПроценкоSub aaa() Const str1 = "ALTER TABLE tblMain ADD CONSTRAINT Ind" Const str2 = " FOREIGN KEY NO INDEX (Id) REFERENCES Sub" Const str3 = " (Ref)" Dim i As Long Dim strQ As String For i = 1 To 35 strQ = str1 & Format(i, "00") & str2 & Format(i, "00") & str3 CurrentDb().Execute strQ Next End Sub Если в отладчике свиснуть строку strQ и сохранить как запрос, все работает, а из кода - ругается :( ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:36 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
2 Д.Проценко то есть у тебя одно поле tblMain.ID ссылается на 35 разных таблиц?? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:40 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Если в отладчике свиснуть строку strQ и сохранить как запрос, все работает, а из кода - ругается :( вот когда телепяты из отпуска придут, они сразу же и догадаются - как же оно ругается так что жди. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:41 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
2 ЛП Run-time error '3289' Ошибка синтаксиса в предложении CONSTRAINT 2 vizio Да, вы абсолютно верно поняли я пытаюсь сделать 35 внешних ключей для таблицы tblMain по полю Id (ключ, счетчик) с таблицами Sub01, Sub02,...,Sub35, каждая из которых имеет поле Ref (длинное целое, возможны повторения) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:49 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Во-первых - не в ту сторону связи делаете!!! Во-вторых - Use ADO :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:51 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
ЛПВо-первых - не в ту сторону связи делаете!!! Во-вторых - Use ADO :) Спасибо, сейчас попробуем, надеюсь разобраться, а разве в моей конструкции NO INDEX относится не к таблице tblMain? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 12:54 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Все не выходит. Делаем в базе 35 запросов вида: ALTER TABLE Sub01 ADD CONSTRAINT Ind01 FOREIGN KEY NO INDEX (Ref) REFERENCES tblMain (Id); . . . ALTER TABLE Sub35 ADD CONSTRAINT Ind35 FOREIGN KEY NO INDEX (Ref) REFERENCES tblMain (Id) выполняем по прядку. На 32 получаем сообщение: "Сбой операции. Слишком много индексов в таблице 'tblMain'. Удалите часть индексов и повторите операцию". Пишем код: Sub bbb() Dim objTbl As TableDef Dim objInd As Index For Each objTbl In CurrentDb().TableDefs If objTbl.Name = "tblMain" Then For Each objInd In objTbl.Indexes Debug.Print objInd.Name Next End If Next End Sub Запускаем, смотрим в Immediate: PrimaryKey Индексы все равно создаются!, но они прячутся в Relations, поэтому в таблице мы их не видим, однако от этого ничего не меняется, т.к. ограничение как было, так и осталось, в чем разница в выполнениях вышеизложенных запросов и создания связей просто в схеме данных? Проверяем: Sub ccc() Dim objRel As Relation Dim countInd As Long countInd = 0 For Each objRel In CurrentDb.Relations If objRel.Table = "tblMain" Or objRel.ForeignTable = "tblMain" Then countInd = countInd + 1 End If Next Debug.Print countInd End Sub Запускаем, смотрим в Immediate: 31 Плюс PrimaryKey, и того 32! На мой взгляд это просто профанация и обман трудового народа. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 13:52 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
На мой взгляд это просто профанация и обман трудового народа. мдя... выходит что так. кстати, On Update Set Null - тоже профанация (даже связь не создает, говорит "ошибочный аргумент") а вот On Delete Set Null почему-то работает (и создает, и обнуляет) бреддд.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 14:11 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
ЛП На мой взгляд это просто профанация и обман трудового народа. мдя... выходит что так. кстати, On Update Set Null - тоже профанация (даже связь не создает, говорит "ошибочный аргумент") а вот On Delete Set Null почему-то работает (и создает, и обнуляет) бреддд.. Видимо связи как и индексы обсчитываются Джетом при помощи какого-нть стека (или ограниченного массива). И тогда индекс должен считаться с кратностью его присутствия в связи? (а как вторичный?) Интересно, а количество констрайнтов типа "ограничение на значение" тоже ограниченно? ЗЫ (убеждался так): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 19:15 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
А NO INDEX должно влиять на автоматическое создание индекса в подчиненной. И к подсчету "количества" индексов в главной (с учетом кратности связей) видимо не относится ни коим боком. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 19:21 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
вот полазил по хелпАм: F1-спецификация Table Attribute Maximum Number of characters in a table name 64 Number of characters in a field name 64 Number of fields in a table 255 Number of open tables 2048; the actual number may be less because of tables opened internally by Microsoft Access Table size 2 gigabyte minus the space needed for the system objects Number of characters in a Text field 255 Number of characters in a Memo field 65,535 when entering data through the user interface; 1 gigabyte of character storage when entering data programmatically Size of an OLE Object field 1 gigabyte Number of indexes in a table 32 Number of fields in an index 10 Number of characters in a validation message 255 Number of characters in a validation rule 2,048 Number of characters in a table or field description 255 Number of characters in a record (excluding Memo and OLE Object fields) 2,000 Number of characters in a field property setting 255 для запросов сказано: Number of enforced relationships 32 per table minus the number of indexes that are on the table for fields or combinations of fields that are not involved in relationships Number of tables in a query 32 Однако принять однозначное решение, о том, что предпоследнее предложение явно утверждает по обсуждаемой теме, я бы все-таки не взялся, несмотря ни на что... :)) ... что же CONSTRAINT касательно, то мне представляется, что NO INDEX - это именно про "ведущую", а не про "подчиненную". В том смысле, что само понятие внешнего ключа соответствует "ведущей" таблице. Любопытно, что приводимый в хелпе для CONSTRAINT синтаксис фактически неполон, соответствует только варианту создания индекса, и должен быть дополнен на создание ограничения CHECK. Этот второй вариант вычитывается из описания к ошибке 3789: F1 Недопустимое ограничение на уровне столбца . (Ошибка 3789) Обычно такая ошибка возникает при использовании инструкции CREATE TABLE или ALTER TABLE ALTER COLUMN. Хотя в ANSI SQL допускается создание ограничений CHECK в рамках определения таблицы, Microsoft® Jet требует, чтобы пользователь создавал ограничение CHECK отдельно от определения COLUMN. Для этого следует вводить ключевое слово CHECK после запятой. Например, следующий синтаксис является правильным, поскольку ограничение CHECK определяется отдельно от столбца и следует за запятой: CREATE TABLE Заказы (КодЗаказа IDENTITY (100,10) CONSTRAINT пкЗаказы PRIMARY KEY, КодЗаказчика LONG CONSTRAINT вкЗаказчикиКодЗаказчика REFERENCES Заказчики (КодЗаказчика), Сальдо DOUBLE, CONSTRAINT ПревышениеКредитногоПределаЗаказчика CHECK (КодЗаказчика IN (SELECT КодЗаказчика FROM Заказчики C WHERE C.КодЗаказчика = Заказы.КодЗаказчика AND C.КредитныйПредел >= (SELECT SUM(Сальдо)FROM Заказы O WHERE O.КодЗаказчика = Заказы.КодЗаказчика))));. Вот кусок русифицированного хелпа по CONSTRAINT. F1 Предложение CONSTRAINT Создание ограничения с помощью предложения CONSTRAINT подобно применению индекса, хотя оно также применяется для установления отношений между таблицами. Предложение CONSTRAINT используется в инструкциях ALTER TABLE и CREATE TABLE для создания или удаления индексов. Существуют два типа предложений CONSTRAINT: одно для создания простого индекса (по одному полю), а второе для создания составного индекса (по нескольким полям). Примечание. Ядро базы данных Microsoft Jet не поддерживает использование инструкции CONSTRAINT и всех инструкций языка определения данных (DDL) с базами данных, несовместимыми со стандартом Microsoft Jet. Используйте вместо них методы Create объектов доступа к данным (DAO). Синтаксис Простой индекс: CONSTRAINT имя {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES внешняяТаблица [(внешнееПоле_1, внешнееПоле_2)] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]} Составной индекс: CONSTRAINT имя {PRIMARY KEY (ключевое_1[, ключевое_2 [, ...]]) | UNIQUE (уникальное_1[, уникальное_2 [, ...]]) | NOT NULL (непустое_1[, непустое_2 [, ...]]) | FOREIGN KEY [NO INDEX] (ссылка_1[, ссылка_2 [, ...]]) REFERENCES внешняяТаблица [(внешнееПоле_1 [, внешнееПоле_2 [, ...]])] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]} Ниже перечислены аргументы предложения CONSTRAINT: Элемент Описание имя Имя создаваемого индекса. ключевое_1, ключевое_2 Имена одного или нескольких полей, которые следует обозначить как ключевые. уникальное_1, уникальное_2 Имена одного или нескольких полей, которые следует включить в уникальный индекс. непустое_1, непустое_2 Имена одного или нескольких полей, в которых запрещаются значения Null. ссылка_1, ссылка_2 Имена одного или нескольких полей, включенных во внешний ключ, которые содержат ссылки на поля в другой таблице. внешняяТаблица Имя внешней таблицы, которая содержит поля, указанные с помощью аргумента внешнееПоле. внешнееПоле_1, внешнееПоле_2 Имя поля или имена полей внешнейТаблицы, указанные с помощью ссылки_1 и ссылки_2. Если адресуемое поле является ключом внешнейТаблицы, данное предложение можно опустить. Дополнительные сведения Предложение CONSTRAINT, предназначенное для создания простого индекса, располагается сразу после описания типа поля в предложении, определяющем поля в инструкции ALTER TABLE или CREATE TABLE. Применяйте предложение CONSTRAINT, предназначенное для создания составного индекса, если требуется использовать зарезервированное слово CONSTRAINT вне предложения, описывающего поля в инструкции ALTER TABLE или CREATE TABLE. Предложение CONSTRAINT позволяет создать для поля индекс одного из описанных ниже типов: • Для создания уникального индекса используйте зарезервированное слово UNIQUE. Это означает, что в таблице не может быть двух записей, имеющих одно и то же значение в этом поле. Уникальный индекс создается для любого поля или любой группы полей. Если в таблице определен составной уникальный индекс, то комбинация значений включенных в него полей должна быть уникальной для каждой записи таблицы, хотя отдельные поля и могут иметь совпадающие значения. • Для создания ключа таблицы, состоящего из одного или нескольких полей, используйте зарезервированные слова PRIMARY KEY. Все значения ключа таблицы должны быть уникальными и отличаться от значения Null. Кроме того, в таблице может быть только один ключ. Примечание. Не используйте зарезервированные слова PRIMARY KEY при создании индекса в таблице, в которой уже определен ключ; в противном случае возникнет ошибка. • Для создания внешнего ключа можно использовать зарезервированные слова FOREIGN KEY. Если ключ внешней таблицы состоит из нескольких полей, необходимо использовать предложение CONSTRAINT, предназначенное для создания составного индекса. При этом следует перечислить все поля, содержащие ссылки на поля во внешней таблице, а также указать имя внешней таблицы и имена полей внешней таблицы, на которые ссылаются поля, перечисленные выше, причем в том же порядке. Если адресуемые поля являются ключами внешней таблицы, указывать эти поля не следует. По умолчанию ядро базы данных воспринимает ключ внешней таблицы как адресуемые поля. Ограничения для внешних ключей определяют конкретные действия, выполняемые в случае изменения значения соответствующего ключа: • Можно указать подлежащие выполнению действия с внешней таблицей, исходя из соответствующего действия, выполняемого над ключом в той таблице, для которой определено предложение CONSTRAINT. Например, рассмотрим следующее определение таблицы «Клиенты»: CREATE TABLE Клиенты (ИндексКлиента INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50)) Рассмотрим следующее определение таблицы «Заказы», в котором задано отношение для внешнего ключа, адресующее ключ в таблице «Клиенты»: CREATE TABLE Заказы (КодЗаказа INTEGER PRIMARY KEY, ИндексКлиента INTEGER, ПримечанияЗаказа NCHAR VARYING (255), CONSTRAINT ВнКлЗаказыИндексКлиента FOREIGN KEY (ИндексКлиента) REFERENCES Клиенты ON UPDATE CASCADE ON DELETE CASCADE Оба предложения ON UPDATE CASCADE и ON DELETE CASCADE определены для внешнего ключа. Предложение ON UPDATE CASCADE означает, что в случае обновления кода клиента (ИндексКлиента) в таблице «Клиенты», в таблице «Заказы» будет произведено соответствующее каскадное обновление. Каждый заказ, содержащий соответствующее значение кода клиента, будет автоматически обновлен с использованием нового значения этого кода. Предложение ON DELETE CASCADE означает, что в случае удаления клиента из таблицы «Клиенты», все строки таблицы «Заказы», содержащие код данного клиента, также будут удалены. Рассмотрим другое определение таблицы «Заказы», где вместо операции CASCADE используется операция SET NULL: CREATE TABLE Заказы (КодЗаказа INTEGER PRIMARY KEY, ИндексКлиента INTEGER, ПримечанияЗаказа NCHAR VARYING (255), CONSTRAINT ВнКлЗаказыИндексКлиента FOREIGN KEY (ИндексКлиента) REFERENCES Клиенты ON UPDATE SET NULL ON DELETE SET NULL Предложение ON UPDATE SET NULL означает, что в случае обновления кода клиента (ИндексКлиента) в таблице «Клиенты», соответствующим значениям внешнего ключа в таблице «Заказы» будут автоматически присвоены значения NULL. Аналогично, предложение ON DELETE SET NULL означает, что в случае удаления клиента из таблицы «Клиенты», всем соответствующим внешним ключам в таблице «Заказы» будут автоматически присвоены значения NULL. Чтобы избежать автоматического создания индексов для внешних ключей, можно использовать модификатор NO INDEX. Такое определение внешних ключей следует использовать только в тех случаях, когда результирующие значения индексов будут часто повторяться. Если значения индекса внешнего ключа часто повторяются, использование индекса может оказаться менее эффективным, чем просто просмотр таблицы. При вставке и удалении строк таблицы ведение индекса этого типа снижает производительность и не дает никаких преимуществ (с выражением лица) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2004, 22:34 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
про NO INDEX взял слова назад... . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2004, 01:03 |
|
Индексы и внешние ключи в Access
|
|||
---|---|---|---|
#18+
Victoshaпро NO INDEX взял слова назад... . слухай (раз уж ты этим топиком заинтересовался) не мог бы ты проверить - работает ли On Update Set Null? У меня только On Delete Set Null отрабатывает оффтоп, конечно, но что делать... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2004, 02:17 |
|
|
start [/forum/moderation_log.php?user_name=stolls]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 10390ms |
total: | 10542ms |
0 / 0 |