2016-11-08 10 views
1

次のように私のSQLコードは次のとおりです。私は確認するよう SQLの自動検証を行に追加するときに、データを

CREATE TABLE personsdb 
(personID int IDENTITY(1,1) NOT NULL, 
personName varchar(50) NOT NULL, 
associatedWith varchar(50) NOT NULL, 
CONSTRAINT pk_persondb PRIMARY KEY (personID), 
CONSTRAINT uq_persondb UNIQUE (associatedWith)) 

INSERT INTO personsdb 
(personID, personName, associatedWith) 
VALUES 
('John', 'Mary'), 
('Jack', 'Maggie'), 
('Jeff', 'Marie') 

は、私は、「associatedWith」列にUNIQUE制約を持っていることPERSONNAME者メアリーはすでにジョンと関連付けられているので、メアリーはジェフと関連付けることはできませんでした。

私のクエリは、テーブルの次の行を挿入することに関連しています。 personNameカラムに 'Mary'を挿入したいが、自動ポペットするか、対応する 'associatedWith'フィールドに 'John'のみを入れることができるルールが必要です。人は他の人としか関連付けることができず、Johnメアリーがテーブルに入力されると、自動的にジョンと関連付けられます。

私は比較的新しいSQLですが、私は可能な限り自分自身でそれを理解したいと思います。もしこれを行う方法をヒントできれば、私は感謝します。行って研究し、これを行う方法を学びます。

ご協力いただきありがとうございます。

デビット

+1

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

+0

こんにちはマーク、謝罪 - 私はMS SQL Management Studioを使用しています。ありがとう、David – David

+0

値が指定されていない場合は 'associatedWith'フィールドの値を入力するか、指定された値をチェックするトリガーが必要です。 https://msdn.microsoft.com/en-us/library/ms189799.aspx – mendosi

答えて

1

これは、外部キーを使用して実装できない単なる関係です。トリガーを使用する必要があります。完全な実装については以下を参照してください。

CREATE TABLE dbo.Person(PersonId int not null primary key identity(1, 1), PersonName varchar(20) not null, AssociatedWith varchar(20)); 

GO 


create trigger dbo.AssociationConstraint 
ON dbo.Person 
FOR INSERT, UPDATE 
AS 
IF (EXISTS(SELECT TOP(1) 1 FROM inserted i INNER JOIN dbo.Person p on i.PersonName = p.AssociatedWith) 
OR EXISTS(SELECT TOP(1) 1 FROM inserted i INNER JOIN dbo.Person p on i.AssociatedWith = p.PersonName)) 
BEGIN 
    RAISERROR('Person is already part of a relationship', 16, 1); 
    ROLLBACK TRANSACTION; 
END 
GO 


insert into dbo.Person(PersonName, AssociatedWith) values('John', 'Mary'), ('Jack', 'Maggie'), ('Jeff', 'Marie'); 
--this will error 
insert into dbo.Person(PersonName, AssociatedWith) values('Mary', 'Jack'); 
+0

ありがとうございました。私はそれを理解していると思っていますが、あなたは私に多くの研究を依頼してくれました。再度ありがとう – David

+0

よろしくお願いします!これがあなたが探していた答えであれば、答えとしてマークしてください。 – under

関連する問題