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

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

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

ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable]

I need to restore this original relation

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

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

I dont need Enforce Referential Integrity

4b9b3361

Ответ 1

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

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

Другими словами, отношение без "принудительной ссылочной целостности" не является ограничением. Это всего лишь "подсказка" о том, что таблицы связаны через указанные поля, например, так что 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

Ответ 2

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

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