Доступ к SQL для создания отношения «один ко многим» без принудительной ссылочной целостности

У меня есть это отношение. И я должен временно уничтожить его, чтобы изменить размер поля «salID» с помощью команды SQL:

ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable] 

Мне нужно восстановить это исходное соотношение

Как я могу воссоздать один и тот же тип отношения, используя команды SQL? Если я использую следующий SQL, я получаю отношение от одного до многих. Это не то, что мне нужно:

 ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [ChildTable] (ChildPK); 

Мне не нужна принудительная ссылочная целостность

Насколько мне известно, Access DDL просто не поддерживает создание Access-отношения без «Enforce Referential Integrity». CREATE CONSTRAINT создаст взаимосвязь с «Enforce Referential Integrity», потому что именно это такое отношение: ограничение ссылочной целостности.

(Предложения ON UPDATE и ON DELETE CREATE CONSTRAINT управляют значениями CREATE CONSTRAINT «Связанные поля Cascade Update Fields» и «Cascade Delete Related Records» в диалоговом окне «Редактировать отношения», но они не контролируют значение «Enforce Referential Integrity» флажок.)

Другими словами, отношение без «принудительной ссылочной целостности» не является ограничивающим фактором. Это всего лишь «подсказка» о том, что таблицы связаны через указанные поля, например, чтобы Query Builder мог автоматически присоединяться к таблицам, если они добавлены в проект запроса.

Чтобы создать отношения без «Принудительной ссылочной целостности», вам необходимо использовать Access DAO. Для отношений вроде этого

EditRelationships.png

требуемый код в VBA будет

 Option Compare Database Option Explicit Public Sub CreateRelationship(relationshipName As String, _ parentTableName As String, childTableName As String, _ parentTablePkName As String, childTableFkName As String) Dim cdb As DAO.Database Set cdb = CurrentDb Dim rel As DAO.Relation Set rel = cdb.CreateRelation(relationshipName, parentTableName, _ childTableName, dbRelationDontEnforce) rel.Fields.Append rel.CreateField(parentTablePkName) ' parent PK rel.Fields(parentTablePkName).ForeignName = childTableFkName ' child FK cdb.Relations.Append rel Set rel = Nothing Set cdb = Nothing End Sub 

Во-первых, ваш «Cihld» (кто-то действительно ошибочно ошибочно принял Child, и он оставил его в схеме ???) table на самом деле является родительской таблицей, а Main Table – дочерней таблицей в соответствии с определением: детальная таблица имеет закрытый столбец внешнего ключа, чтобы иметь значения первичного ключа из родительской таблицы. Это смешение, а также орфографическая ошибка, свидетельствуют о полном беспорядке.

Тем не менее, допустимо, чтобы столбец внешнего ключа был определен как обнуляемый (т. Е. Не определял их с помощью модификатора NOT NULL ). Сделайте это и просто установите столбец внешнего ключа в NULL зависимости от того, какие строки вы хотите не привязать к родительской таблице.