Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Индексы и внешние ключи в Access / 25 сообщений из 28, страница 1 из 2
28.12.2004, 15:52
    #32848119
VSLAV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Нужно ли создавать индексы по колонкам, по которым построен внешний ключ (для 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 автоматически создал индекс, когда создавался внешний ключ ?
...
Рейтинг: 0 / 0
28.12.2004, 15:58
    #32848143
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Получается, что Access автоматически создал индекс, когда создавался внешний ключ ?
Да
...
Рейтинг: 0 / 0
28.12.2004, 16:59
    #32848328
vizio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
по умолчанию создает и не только для внешних ключей
эту фичу можно отключить
...
Рейтинг: 0 / 0
28.12.2004, 18:16
    #32848549
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
vizioпо умолчанию создает и не только для внешних ключей
эту фичу можно отключить
А где можно отключить создание индекса для внешнего ключа? Просветите, а то ограничение в 32 индекса на одну таблицу вынуждают меня создавать таблицы-призраки (копии) для поддержки целостности базы (база порядка 300 таблиц, технология предусматривает схему в виде звезды, т.е. огромное количество табиц являются подчиненными для одной таблицы).
...
Рейтинг: 0 / 0
29.12.2004, 09:26
    #32848883
vizio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
не очень понял проблему
индексы ведь всегда можно удалить
другое дело, что соответствующие запросы тормозить начнут
а вообще, по-видимому, дело не во внешних ключах, а в названиях столбцов
по умолчанию, если имя столбца начинается с или заканчивается на "ID;key;code;num", то создается индекс
менять эту настройку можно в "Tools -> Options -> Tables/Queries -> AutoIndex on Import/Create"

если проблема действительно связана с внешними ключами, то объясни подробнее
...
Рейтинг: 0 / 0
29.12.2004, 09:33
    #32848895
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
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]}
...
Рейтинг: 0 / 0
29.12.2004, 10:48
    #32849087
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Лох Позорный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.
...
Рейтинг: 0 / 0
29.12.2004, 10:49
    #32849094
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Пардон, сам не внимателен: Примечание. Ядро базы данных Microsoft Jet не поддерживает использование инструкции CONSTRAINT и любых других инструкций языка описания данных (DDL) с базами данных, не основанными на Microsoft Jet. В таких базах данных следует применять методы Create для объектов DAO.

Так, что нужно попробовать, как немного освобожусь
...
Рейтинг: 0 / 0
29.12.2004, 12:08
    #32849311
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Конструкция FOREIGN KEY NO INDEX к сожалению не поддерживается в БД Jet (mdb) ни в 97, ни в 2000, ни в 2003 формате. (на NO следует сообщение "Ошибка синтаксиса в предложении CONSTRAINT". Так, что дядя Бил, нас видимо в очередной раз обманул.
...
Рейтинг: 0 / 0
29.12.2004, 12:13
    #32849335
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
А SQL-92 кто будет включать?
...
Рейтинг: 0 / 0
29.12.2004, 12:22
    #32849368
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Да, если включить опцию и создать запрос
"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
...
Рейтинг: 0 / 0
29.12.2004, 12:29
    #32849397
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
хм...
а ты уверен, что ты в правильную сторону связи строишь?

З.Ы.
а вот такой код не работает
очень, очень печально
но телепяты в отпуске.
...
Рейтинг: 0 / 0
29.12.2004, 12:36
    #32849418
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Так я же привел весь код:

Д.Проценко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 и сохранить как запрос, все работает, а из кода - ругается :(
...
Рейтинг: 0 / 0
29.12.2004, 12:40
    #32849424
vizio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
2 Д.Проценко
то есть у тебя одно поле tblMain.ID ссылается на 35 разных таблиц??
...
Рейтинг: 0 / 0
29.12.2004, 12:41
    #32849427
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Если в отладчике свиснуть строку strQ и сохранить как запрос, все работает, а из кода - ругается :(
вот когда телепяты из отпуска придут, они сразу же и догадаются - как же оно ругается
так что жди.
...
Рейтинг: 0 / 0
29.12.2004, 12:49
    #32849447
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
2 ЛП

Run-time error '3289'
Ошибка синтаксиса в предложении CONSTRAINT

2 vizio
Да, вы абсолютно верно поняли я пытаюсь сделать 35 внешних ключей для таблицы tblMain по полю Id (ключ, счетчик) с таблицами Sub01, Sub02,...,Sub35, каждая из которых имеет поле Ref (длинное целое, возможны повторения)
...
Рейтинг: 0 / 0
29.12.2004, 12:51
    #32849453
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Во-первых - не в ту сторону связи делаете!!!
Во-вторых - Use ADO :)
...
Рейтинг: 0 / 0
29.12.2004, 12:54
    #32849466
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
ЛПВо-первых - не в ту сторону связи делаете!!!
Во-вторых - Use ADO :)

Спасибо, сейчас попробуем, надеюсь разобраться, а разве в моей конструкции NO INDEX относится не к таблице tblMain?
...
Рейтинг: 0 / 0
29.12.2004, 13:52
    #32849656
Д.Проценко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Все не выходит. Делаем в базе 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!

На мой взгляд это просто профанация и обман трудового народа.
...
Рейтинг: 0 / 0
29.12.2004, 14:11
    #32849728
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
На мой взгляд это просто профанация и обман трудового народа.
мдя... выходит что так.

кстати, On Update Set Null - тоже профанация (даже связь не создает, говорит "ошибочный аргумент")
а вот On Delete Set Null почему-то работает (и создает, и обнуляет)

бреддд..
...
Рейтинг: 0 / 0
29.12.2004, 19:15
    #32850537
мдя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
ЛП На мой взгляд это просто профанация и обман трудового народа.
мдя... выходит что так.

кстати, 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.
Public Function AddSlave(Num As Long)
Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field
Dim idx As DAO.Index, fldIndex As DAO.Field, rel As DAO.Relation
    
Dim i As Long
'On Error GoTo err:
Set dbs = CurrentDb()
    For i =  0  To Num -  1 
        Set tdf = dbs.CreateTableDef("Slave_" & i)
        Set fld = tdf.CreateField("sid", dbLong)
        fld.Attributes = fld.Attributes + dbAutoIncrField
        tdf.Fields.Append fld
        Set fld = tdf.CreateField("mid", dbLong)
        tdf.Fields.Append fld
        Set fld = tdf.CreateField("sName", dbText,  40 )
        tdf.Fields.Append fld
        
        Set idx = tdf.CreateIndex("PrimaryKey")
        Set fldIndex = idx.CreateField("sid", dbLong)
        idx.Fields.Append fldIndex
        idx.Primary = True
        tdf.Indexes.Append idx
        
        dbs.TableDefs.Append tdf
        dbs.TableDefs.Refresh
       
        Set rel = dbs.CreateRelation("tblMain_Slave_" & i)
        rel.Table = "tblMain"
        rel.ForeignTable = tdf.Name
        rel.Attributes = dbRelationDeleteCascade And dbRelationUpdateCascade
        Set fld = rel.CreateField("id")
        fld.ForeignName = "mid"
        rel.Fields.Append fld
        dbs.Relations.Append rel
    Next
    
ex:
    Exit Function
err:
    MsgBox err.Description
End Function
Ошибка на вставке связи в 31-й Slave.
...
Рейтинг: 0 / 0
29.12.2004, 19:21
    #32850545
мяд
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
А NO INDEX должно влиять на автоматическое создание индекса в подчиненной. И к подсчету "количества" индексов в главной (с учетом кратности связей) видимо не относится ни коим боком.
...
Рейтинг: 0 / 0
29.12.2004, 22:34
    #32850636
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
вот полазил по хелпАм:

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. Такое определение внешних ключей следует использовать только в тех случаях, когда результирующие значения индексов будут часто повторяться. Если значения индекса внешнего ключа часто повторяются, использование индекса может оказаться менее эффективным, чем просто просмотр таблицы. При вставке и удалении строк таблицы ведение индекса этого типа снижает производительность и не дает никаких преимуществ




(с выражением лица)
...
Рейтинг: 0 / 0
30.12.2004, 01:03
    #32850672
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
про NO INDEX взял слова назад...
.
...
Рейтинг: 0 / 0
30.12.2004, 02:17
    #32850684
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы и внешние ключи в Access
Victoshaпро NO INDEX взял слова назад...
.
слухай (раз уж ты этим топиком заинтересовался) не мог бы ты проверить - работает ли On Update Set Null? У меня только On Delete Set Null отрабатывает

оффтоп, конечно, но что делать...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Индексы и внешние ключи в Access / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]