2017-03-08 65 views
0

我有兩個問題,我不能修復,你想爲soe幫助 我有一個表有四個字段,其中兩個是相關的,所以只有其中一個必須寫入值,另一個必須爲NULL。我的意思是,如果這兩個字段FIELD1和FIELD2表應該是這樣的:SQL服務器約束

field1 field2 
NULL value -- correct 
value NULL -- correct 
NULL NULL -- incorrect 
value value -- incorrect 

有沒有一種方法,使約束或索引,我不知道,在表的定義等等領域應這樣寫的例子

如果這是不可能 第二個問題是,正因爲如此我使用的MS Access,使記錄到表中,如何在形式 記錄前檢查字段填寫不正確以提醒用戶必須編輯插入的信息。

謝謝先進。

+1

您將需要在MS Access中使用VBA。嘗試BeforeUpdate事件。 – Fionnuala

回答

0
You can try using trigger INSTEAD OF (but be careful...). Another way can be to build a stored procedure to make or not insert/update, and call the stored procedure from application. 

Just for example (should be completed with check, error try, etc.): 

CREATE TABLE T1 (ID int NOT NULL, field1 int, field2 int); 
ALTER TABLE T1 ADD CONSTRAINT T1_PK PRIMARY KEY(ID); 
GO 
CREATE TRIGGER T1_TRG_INS ON T1 
INSTEAD OF INSERT  
AS 
BEGIN 
IF EXISTS (SELECT 1 FROM inserted i WHERE (i.field1 IS NULL AND i.field2 IS NULL) OR (i.field1 IS NOT NULL AND i.field2 IS NOT NULL)) 
    BEGIN 
    PRINT 'Data error. No data inserted.' 
    END 
    ELSE BEGIN 
     INSERT INTO T1 (ID, field1, field2) SELECT ID, field1, field2 FROM inserted 
     END 
END 
GO 
CREATE TRIGGER T1_TRG_UPD ON T1 
INSTEAD OF UPDATE 
AS 
BEGIN 
IF EXISTS (SELECT 1 FROM inserted i WHERE (i.field1 IS NULL AND i.field2 IS NULL) OR (i.field1 IS NOT NULL AND i.field2 IS NOT NULL)) 
    BEGIN 
    PRINT 'Data error. No data updated.' 
    END 
    ELSE BEGIN 
     UPDATE T1 SET field1=i.field1, field2=i.field2 
     FROM inserted i WHERE T1.ID = i.ID 
     END 
END 
GO 
----testing----- 
SELECT * FROM T1 
INSERT INTO T1 (ID, field1, field2) VALUES (1, NULL, NULL); -- NOT inserted 
INSERT INTO T1 (ID, field1, field2) VALUES (2, NULL, 1); -- inserted 
INSERT INTO T1 (ID, field1, field2) VALUES (3, 1, NULL); -- inserted 
INSERT INTO T1 (ID, field1, field2) VALUES (4, 1, 1); -- NOT inserted 

UPDATE T1 SET field1 = 1 WHERE ID=2 -- not updated 
UPDATE T1 SET field2 = 2 WHERE ID=2 -- updated 
UPDATE T1 SET field1 = NULL, field2=3 WHERE ID=2 -- updated 
UPDATE T1 SET field1 = 4, field2=NULL WHERE ID=2 -- updated 
UPDATE T1 SET field1 = 4, field2=5 WHERE ID=2 -- not updated