2015-09-22 38 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