我想为自己的虚拟目的创建一个表,但我希望它如下:
2列,“打开”和“付费”。当pay为0 / null时,open必须为1000。open为null / 0则必须为1000。我不确定如何将其烘焙到CREATE TABLE语句中!你能指出我正确的方向吗?
答案 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
语句来完成此操作。如果要使其工作,还需要触发器(更新后和插入后)。另外,您需要定义如果同时向两列插入或更新0
或null
会发生什么情况。
如果您的餐桌是:
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