2016-11-08 1 views
1
rudern

My SQL-Code ist wie folgt:SQL auto-Validierung Daten, wenn es das Hinzufügen

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') 

ich eine UNIQUE Constraint auf der ‚associatedWith‘ Spalte haben, wie ich in person, dass eine Person sicherstellen möchten, kann nur mit einer Person in associatedWith assoziiert werden, dh Mary konnte nicht mit Jeff assoziiert werden, da Mary bereits mit John assoziiert ist.

Meine Abfrage bezieht sich auf das Einfügen der nächsten Zeile der Tabelle. Ich möchte 'Mary' in die personName -Spalte einfügen, aber brauche eine Regel, die automatisch 'John' im entsprechenden 'associatedWith'-Feld auffüllt oder nur zulässt, dass eine Person nur mit einer anderen Person und als John verknüpft werden kann ist bereits mit Maria verbunden, wenn Maria in den Tisch eintritt, sollte sie automatisch mit Johannes verbunden werden.

Ich bin relativ neu in SQL, aber ich würde es gerne so weit wie möglich selbst herausfinden - wenn Sie einen Weg dazu angeben könnten (in Laiensprache) wäre ich dankbar, dass ich es kann geh und forsche und lerne, wie das geht.

Vielen Dank im Voraus für Ihre Hilfe.

David

+1

Für welches RDBMS ist das? Bitte fügen Sie ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' verwenden - oder etwas ganz anderes. –

+0

Hallo Marc, Entschuldigung - Ich benutze MS SQL Management Studio. Danke, David – David

+0

Klingt so, als ob Sie einen Trigger wünschen, der einen Wert für das Feld 'associatedWith' ausfüllt, wenn kein Wert angegeben wird, oder einen übergebenen Wert überprüft. https://msdn.microsoft.com/en-us/library/ms189799.aspx – mendosi

Antwort

1

Dies ist eine einstellige Beziehung, die Sie sich nicht mit Fremdschlüssel implementieren können. Sie müssen einen Auslöser verwenden. Siehe unten für die vollständige Implementierung.

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

Vielen Dank. Denke, ich verstehe es, aber du hast mir genug gegeben, um zu forschen. Danke nochmal – David

+0

Gern geschehen! Bitte markieren Sie es als beantwortet, wenn dies die Antwort ist, nach der Sie gesucht haben. – under

Verwandte Themen