【问题标题】:SQL Server: add constraint that compares the date from 2 tablesSQL Server:添加比较来自 2 个表的日期的约束
【发布时间】:2017-11-19 05:11:54
【问题描述】:

我有 2 张桌子:

  • 歌曲 = { isrc、标题、年份、艺术家姓名}
  • 艺术家 = { 艺术家姓名、开始日期、成员、流派 }

键:

  • 歌曲 – isrc
    • Song 中的artistname 是引用 Artist 的外键
  • 艺术家 - 艺术家姓名

我需要在 Songs 表中添加一个约束,以便插入的记录年份必须大于或等于艺术家的开始日期(年份)所以我尝试了这个:

alter table Song 
add constraint GreaterThanStartDate 
    check (year > (select startdate from Artist, Song 
                   where Artist.artistname = Song.artistname));

它不起作用,因为检查只接受标量值。所以我认为我应该使用用户定义的函数:

create function CompareStartDate()
returns int
as
begin 
    declare @result int

    if (some condition here)
        set @result = 1
    else 
        set @result = 0

    return @result 
end

我被困在 if 语句中写条件(我可以加入 Artist 和 Song 表,但是如何比较 2 列并返回 1 或 0)。我不确定我是否走在正确的轨道上。

【问题讨论】:

  • 用户定义的函数绝对是在正确的轨道上。

标签: sql sql-server check-constraints


【解决方案1】:

您可以将参数从 Song 表中传递给函数,如下所示:

CREATE FUNCTION CompareStartDate(@artistname varchar(255), @year int)
RETURNS bit
AS

BEGIN

    DECLARE @result bit

    IF (SELECT TOP 1 YEAR(startdate) FROM Artist WHERE artistname = @artistname) <= @year
        SET @result = 1
    ELSE
        SET @result = 0

    RETURN @result 

END

您的约束将类似于:

ALTER TABLE Song
WITH CHECK
ADD CONSTRAINT CheckYear
CHECK (CompareStartDate(artistname, year) = 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多