2012-04-30 28 views
4

使用MS接取2007數據庫由vb.net應用 訪問,我有兩個現有的表的MS Access設置級聯到空約束到現有的表

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 

我想補充的級聯NULL約束members.bandId和bands.ID

之間的關係,這是我

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

但我收到此錯誤信息:

語法錯誤的約束條款

從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表設置關係級聯到空?

謝謝!級聯各種DBMS效果

+1

你混合你的條件找到

功能。 'CASCADE'和'SET NULL'是不同的參考動作。 – onedaywhen

回答

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

0

選項包括:

ON DELETE SET NULL

ON DELETE CASCADE

ON DELETE RESTRICT

ON DELETE NO ACTION

我覺得MS-Access有前兩個。所以,它應該是:

ON DELETE SET NULL

+0

我嘗試: ALTER TABLE membres添加約束membresBands_FK 外鍵(帶)參考頻帶(ID)ON DELETE SET NULL 和我的相同的錯誤消息 – pec

+0

毫不奇怪它也支持'ON DELETE NO ACTION'並且是默認選項 - 強制用戶在前兩個之間進行選擇是最奇怪的「級聯效應」是誤導性的(可以說只有其中一個「級聯效應」);標準SQL術語是「引用觸發操作」(並且「SET NULL」是「引用操作」的示例)。 – onedaywhen

0

據我所知,有在Access NO Cascade to Null。只有Cascade DeleteCascade Update

+1

**從MSDN:** 級聯操作也可以通過使用外鍵關係對話框中定義: _ [ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}] _ _ [ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}] _ – pec

+0

+1,我看到了Brian的回覆和您的評論。我從來沒有發現過! –

4

可以在Access中創建這種約束,但只能通過Jet OLE DB Provider和ADO。例如,在訪問數據庫,你可以通過運行下面的VBA代碼創建約束:

CurrentProject.Connection.Execute "ALTER TABLE membres ADD CONSTRAINT membresBands_FK FOREIGN KEY (bandID) REFERENCES bands(ID) ON DELETE SET NULL" 
+0

我剛剛使用vb模塊解決了我的問題,如[link](http://allenbrowne.com/ser-64.html)所示。我會查看你的建議。 – pec

+0

我試過了你的建議,但得到了同樣的錯誤信息。我的查詢可能有問題。 – pec

+1

您是否嘗試過我發佈的查詢,或者您是否嘗試過在原始消息中發佈的查詢?我問的原因是,在原始消息中發佈的查詢中,「REFERENCE」應該是「REFERENCES」。無論如何,我很高興你能以這種或那種方式找到解決方案。 –

0

docs for Access說,它支持以下參照觸發動作:

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

...但是,實際上它只支持前三個即不支持ON UPDATE SET NULL。爲了進一步闡明,引擎根本不支持ON UPDATE SET NULL引用觸發操作,即不僅僅是DDL語法。