sql或linq to sql Unique Constraint基于两列值

时间:2016-11-19 11:22:17

标签: c# sql linq-to-sql

我不知道是否可能。 我有一个表来保存书籍问题的记录返回。这一个中有两列是[status]和其他[bookid]。我想在sql中添加一个约束,限制用户为status =“插入重复记录问题“与同一个bookid。

例如,如果已经存在status ='issue'且bookid = 1的记录,那么它不能允许插入status =“issue”和bookid = 1的其他记录,但是我可以使用其他状态的多字符记录staus ='return'和bookid = 1可能会多次出现。

或者在c#

中可能有使用linq to sql的解决方案

3 个答案:

答案 0 :(得分:1)

这里有一个复杂的情况,因此UNIQUE约束对你没有帮助。您需要CHECK约束。

您首先需要一个功能来进行检查:

CREATE FUNCTION dbo.IsReturnDuplicate
(
    @id INT,
    @bookid INT,
    @status VARCHAR(MAX)
)
RETURNS BIT
AS
BEGIN
    RETURN (SELECT TOP 1 COUNT (*) FROM bookreturns WHERE (id <> @id) AND (status = @status) AND (bookid = @bookid) AND (status = 'issue')
END

如果表中已有一行状态为“issue”并且ID不同,则返回1

然后,您可以使用此功能

创建CHECK约束
CREATE TABLE bookreturns (
    --...
    CONSTRAINT CK_bookreturns_status CHECK (dbo.IsReturnDuplicate(id, bookid, status) == 0)
)

答案 1 :(得分:1)

通常,您不需要用户定义的功能。在SQL Server(以及许多其他数据库)中,您只需使用筛选索引:

create unique index unq_bookissue
    where status = 'issued' ;

在早期版本的SQL Server中,您可以使用计算列执行此操作,假设您有一个包含以下列的表:

  • BookId,跨行重复。
  • Status,当值为issue时,它应该是唯一的。
  • BookIssueId,唯一标识每一行。

然后,添加计算列以跟踪status = 'issue'

alter table t add computed_bookissueid as (case when status = 'issue' then -1 else BookIssueId end);

现在在此列上添加一个唯一索引BookId

create unique index unq_bookid_issue on (BookId, computed_bookissueid);

答案 2 :(得分:0)

使用Gordon answer

<input id="box1" type="checkbox" class="checkbox" value="bx1=1"> <label for="box1"></label>
<input id="box2" type="checkbox" class="checkbox" value="bx2=1"> <label for="box1"></label>

<script>
    $(".checkbox").on("change", function() {
        var values = [];
        $('.checkbox:checked').each(function() {
            var result = $(this).val();
            values.push(result);
        });
        var key = $(".link").html(values.join("&"));
        document.write('<a href="http://www.example.com/test.html?' + key + '">Open here</a>');
    });
</script>

为我工作