创建表时,其他列不可以为null,并且解决方法

时间:2018-08-30 13:31:56

标签: sql-server

我想为自己的虚拟目的创建一个表,但我希望它如下:

2列,“打开”和“付费”。当pay为0 / null时,open必须为1000。open为null / 0则必须为1000。我不确定如何将其烘焙到CREATE TABLE语句中!你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:4)

您可以在CREATE TABLE语句中使用CHECK CONSTRAINT来完成此操作。

答案 1 :(得分:2)

如果我理解的正确,那么您希望两列的值都可以与0/null不同,或者当其中一列具有0/null时,另一列应该为1000吗?

这可以通过如下检查约束来完成:

create table #test (
  [Open] int null,
  Paid int null,

  constraint CK_Values check ( (isnull([Open], 0) <> 0) and (isnull([Paid], 0) <> 0)
                               or
                               ((isnull([Open], 0) = 0 and Paid is not null and Paid = 1000) or (isnull([Paid], 0) = 0 and [Open] is not null and [Open] = 1000))
                             )  
)

insert into #test values (1, 2)       -- success
insert into #test values (0, 1000)    -- success
insert into #test values (null, 1000) -- success
insert into #test values (1000, 0)    -- success
insert into #test values (1000, null) -- success

insert into #test values (0, 2)       -- fails
insert into #test values (null, 2)    -- fails
insert into #test values (2, 0)       -- fails
insert into #test values (2, null)    -- fails
insert into #test values (null, null) -- fails
insert into #test values (0, 0)       -- fails

答案 2 :(得分:-1)

您将无法仅使用create table语句来完成此操作。如果要使其工作,还需要触发器(更新后和插入后)。另外,您需要定义如果同时向两列插入或更新0null会发生什么情况。

如果您的餐桌是:

create table dummy (your_pk int primary key, open numeric(18,2), paid numeric(18,2));

您可以使用这样的触发器:

CREATE TRIGGER dummy_trg_ins 
ON  dummy  
AFTER INSERT 
AS  
BEGIN 
    UPDATE dummy
    SET paid = 1000
    FROM Tb
    INNER JOIN inserted i on i.your_pk = dummy.your_pk
    WHERE i.open is null or i.open = 0
    UPDATE dummy
    SET open = 1000
    FROM Tb
    INNER JOIN inserted i on i.your_pk = dummy.your_pk
    WHERE i.paid is null or i.paid = 0
END  
GO

类似地,您将需要一个更新触发器:

CREATE TRIGGER dummy_trg_upd 
ON  dummy 
AFTER UPDATE 
AS  
BEGIN 
    UPDATE dummy
    SET paid = 1000
    FROM Tb
    INNER JOIN updated i on i.your_pk = dummy.your_pk
    WHERE i.open is null or i.open = 0
    UPDATE dummy
    SET open = 1000
    FROM Tb
    INNER JOIN updated i on i.your_pk = dummy.your_pk
    WHERE i.paid is null or i.paid = 0
END  
GO