【问题标题】:SQL auto-validating data when adding it to row将数据添加到行时 SQL 自动验证数据
【发布时间】:2016-11-08 22:49:02
【问题描述】:

我的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 已经与约翰。

我的查询与插入表的下一行有关。我想在 personName 列中插入“玛丽”,但需要一个自动填充或只允许在相应的“关联”字段中填充“约翰”的规则,因为一个人只能与另一个人关联,并且作为约翰已经与 Mary 关联,当 Mary 被输入到表中时,她应该自动与 John 关联。

我对 SQL 比较陌生,但我想自己尽可能地弄清楚 - 如果你能暗示一种方法来做到这一点(用外行的话),我将不胜感激,以便我可以去并研究并学习如何做到这一点。

非常感谢您的帮助。

大卫

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 嗨,Marc,抱歉 - 我正在使用 MS SQL Management Studio。谢谢,大卫
  • 听起来你想要一个触发器,如果​​没有提供值,它将填充 associatedWith 字段的值,或者检查提供的值。 msdn.microsoft.com/en-us/library/ms189799.aspx
  • 没问题,我没有使用触发器的经验,否则我会发布一个示例。当你得到一个满足你要求的作品时,你会在这里分享吗?

标签: sql sql-server unique auto-populate


【解决方案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');

【讨论】:

  • 非常感谢。我想我明白了,但你给了我很多东西去研究。再次感谢
  • 不客气!如果这是您正在寻找的答案,请将其标记为已回答。
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多