4

使用 vb.net 应用程序访问的 MS Acess 2007 数据库我有两个现有表

Members
-------
ID     name     bandID
-----------------------
0      Pierre   1
1      Chart    3
2      John     3
3      Dave     2  

Bands
-----
ID     bandName
----------------
1      Band a
2      Band b
3      Band c

我想为 members.bandId 和bands.ID 之间的关系添加一个级联到空约束

这就是我所拥有的

ALTER TABLE members ADD CONSTRAINT membresBands_FK
    FOREIGN KEY (bandID) REFERENCE Bands(ID) ON DELETE CASCADE SET NULL

但我收到此错误消息:

CONSTRAINT 子句中的语法错误

从msdn我发现

CREATE TABLE Orders 
  (OrderId INTEGER PRIMARY KEY, 
  CustId INTEGER, 
  OrderNotes NCHAR VARYING (255), 
  CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) 
  REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL

是否可以更改 MS Access 中的表以将级联关系设置为空?

谢谢!

4

5 回答 5

5

可以在 Access 中创建这种约束,但只能通过 Jet OLE DB Provider 和 ADO。例如,对于 Access 中的数据库,您可以通过运行以下 VBA 代码来创建约束:

CurrentProject.Connection.Execute "ALTER TABLE membres ADD CONSTRAINT membresBands_FK FOREIGN KEY (bandID) REFERENCES bands(ID) ON DELETE SET NULL"
于 2012-04-30T17:03:19.770 回答
1

我不得不等待八小时才能发布这个...

使用 Visual Basic 模块

'Define the bit value for the relation Attributes.
Public Const dbRelationCascadeNull As Long = &H2000

Public Function MakeRel()
    'Purpose: Create a Cascade-to-Null relation using DAO.
    Dim db As DAO.Database
    Dim rel As DAO.Relation
    Dim fld As DAO.Field

    Set db = CurrentDb()
    'Arguments for CreateRelation(): any unique name, primary table, related table, attributes.
    Set rel = db.CreateRelation("membre_bands", "bands", "membres", dbRelationCascadeNull)
    Set fld = rel.CreateField("ID")  'The field from the primary table.
    fld.ForeignName = "band"           'Matching field from the related table.
    rel.Fields.Append fld                    'Add the field to the relation's Fields collection.
    db.Relations.Append rel                  'Add the relation to the database.


    'Report and clean up.
    Debug.Print rel.Attributes
    Set db = Nothing
End Function

然后调用 MakeRel 函数

http://allenbrowne.com/ser-64.html上的函数

于 2012-05-01T00:53:10.197 回答
0

各种 DBMS 中的级联效果选项有:

ON DELETE SET NULL

ON DELETE CASCADE

ON DELETE RESTRICT

ON DELETE NO ACTION

我认为 MS-Access 有前两个。所以,它应该是:

ON DELETE SET NULL

于 2012-04-30T16:07:55.493 回答
0

AFAIK,Cascade to NullAccess 中没有。只有Cascade DeleteCascade Update

于 2012-04-30T16:10:20.437 回答
0

Access的文档说它支持以下引用触发操作:

ON DELETE CASCADE
ON UPDATE CASCADE
ON DELETE SET NULL
ON UPDATE SET NULL

...但是,实际上它只支持前三个,即不支持ON UPDATE SET NULL。为了进一步澄清,引擎根本不支持ON UPDATE SET NULL引用触发操作,即不仅仅是 DDL 语法。

于 2012-04-30T23:46:31.640 回答