2015-09-22 39 views
4

我想向我的数据库表中添加一个约束,以便字符串“用户名”只能输入到最多10次的某个列中。这可能吗?限制只允许10个字符串“用户名”的实例

我正在使用ms sql server。

+0

我认为这更符合业务逻辑,所以我会从应用程序而不是数据库处理它 – Gouda

+0

你的意思是在文本列值的内容来计算“用户名”?就像为CEO等文本中的关键字计数一样 – Eralper

回答

6

一些事情,你可以使用AFTER触发UPDATE/INSERT

SQLFiddleDEMO

CREATE TABLE tab(col NVARCHAR(100)); 

CREATE TRIGGER trg_tab 
ON tab 
AFTER INSERT, UPDATE 
AS 
IF (SELECT COUNT(*) FROM tab WHERE col = 'username') > 10 
ROLLBACK; 

INSERT INTO tab(col) 
VALUES ('username'), ('username'), ('username'), ('username'), 
     ('username'), ('username'), ('username'), ('username'), 
     ('username'),('username'); 

INSERT INTO tab(col) 
VALUES ('username'); 

/* The transaction ended in the trigger. The batch has been aborted. */ 

或者使用SCALAR FUNCTIONCHECK约束:

SQLFiddleDemo2

CREATE TABLE tab(col NVARCHAR(100)); 

CREATE FUNCTION dbo.CheckFunction() 
RETURNS INT 
AS 
BEGIN 
    RETURN (SELECT COUNT(*) FROM tab WHERE col = 'username') 
END; 

ALTER TABLE tab 
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFunction() <= 10); 

INSERT INTO tab(col) 
VALUES ('username'), ('username'), ('username'), ('username'), 
     ('username'), ('username'), ('username'), ('username'), 
     ('username'),('username'); 

INSERT INTO tab(col) 
VALUES ('username'); 

/* The INSERT statement conflicted with the CHECK constraint "chkRowCount". 
The conflict occurred in database "db_6_34d5e", table "dbo.tab". */ 
2

在表上创建一个AFTER INSERT触发器。这样

create trigger LimitTable 
on YourTableToLimit 
after insert 
as 
    declare @tableCount int 
    select @tableCount = Count(*) 
    from YourTableToLimit 

    if @tableCount > 50 
    begin 
     rollback 
    end 
go