SQL 将数据添加到行时自动验证数据
SQL auto-validating data when adding it to row
我的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' 列上有一个唯一约束,因为我想确保 personName 中的一个人只能与 associatedWith 中的一个人关联,即 Mary 不能与 Jeff 关联,因为 Mary已与 John 相关联。
我的查询涉及插入 table 的下一行。我想将 'Mary' 插入到 personName 列中,但需要一个自动填充或仅允许 'John' 填充到相应的 'associatedWith' 字段中的规则,因为一个人只能与一个人相关联其他人,并且由于 John 已经与 Mary 相关联,因此当将 Mary 输入 table 时,她应该自动与 John 相关联。
我是 SQL 的新手,但我想自己尽可能多地弄明白 - 如果您能暗示一种方法(通俗地说),我会感激不尽,这样我就可以去研究并学习如何做到这一点。
非常感谢您的帮助。
大卫
这是一个无法使用外键实现的一元关系。你必须使用触发器。请参阅下面的完整实施。
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');
我的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' 列上有一个唯一约束,因为我想确保 personName 中的一个人只能与 associatedWith 中的一个人关联,即 Mary 不能与 Jeff 关联,因为 Mary已与 John 相关联。
我的查询涉及插入 table 的下一行。我想将 'Mary' 插入到 personName 列中,但需要一个自动填充或仅允许 'John' 填充到相应的 'associatedWith' 字段中的规则,因为一个人只能与一个人相关联其他人,并且由于 John 已经与 Mary 相关联,因此当将 Mary 输入 table 时,她应该自动与 John 相关联。
我是 SQL 的新手,但我想自己尽可能多地弄明白 - 如果您能暗示一种方法(通俗地说),我会感激不尽,这样我就可以去研究并学习如何做到这一点。
非常感谢您的帮助。
大卫
这是一个无法使用外键实现的一元关系。你必须使用触发器。请参阅下面的完整实施。
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');