2017-03-08 3 views
0

を制約しますNULLにする必要があります。フィールドが必要がありますのでSQLサーバは別の、唯一のそれらのいずれかに書き込まれた値でなければならないので、私は私が修正することはできません二つの問題、あなたはSOEのヘルプ のために希望私は四つのフィールドを持つテーブルを持っている、彼ら二人が関係しているを持っている

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

は、制約またはインデックスを作成する方法はあります、私はわからないんだけど、テーブルの定義で:私は両方のフィールドがフィールド1であり、フィールド2の表は、次のようになります場合は、このことを意味します例のように書かれている

2番目の質問は、私がテーブルのレコードを作成するために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 
関連する問題