插入某些数据时将列从 NULL 更改为 NOT NULL
Changing the column from NULL to NOT NULL when some data is inserted
我有一栏Col1 nvarchar(10) null
我必须编写检查约束或触发器(我认为使用检查约束是不可能的),当且仅当某些数据输入到字段中时,才会将 Col1
从 null 更改为 not null或者,更确切地说,在向字段中输入一些非空值后,它将拒绝该列获得空值。
这是因为应用程序首先检查该字段是否为空,如果是,则向其添加一些值。之后该字段不能改回空值。
现在我有以下内容:
create trigger [TRG_Col1_NotNull] on my.Table
instead of update
as
begin
if exists (
select * from inserted as i
where i.Col1 is null
)
raiserror ('You can not change the value of Col1 to null', 16, 1)
rollback transaction
end
这是最好的(甚至是正确的)方法吗?或者是否有更好更简单的解决方案(也许以某种方式检查约束)?
好的!更新!
应用程序是这样工作的:
它首先将数据保存到 table 中的 PK column, Col1, Col2, Col3
值 1, null, text, date
。之后它检查 Col1
是否为 null 并读取 PK column
并将其值写入 Col1
。所以我得到 1, 1, text, data
.
这可以满足您的要求(我知道:它是在 UPDATE 之后,所以实际上,您将更改值两次,但我不会使用 AFTER/INSTEAD:如果应该更新其他值怎么办?) .
CREATE TABLE TES1 (ID INT, COL1 VARCHAR(10));
INSERT INTO TES1 VALUES (1,'X');
INSERT INTO TES1 VALUES (2,NULL);
CREATE TRIGGER TRG1 ON TES1
AFTER UPDATE
AS
BEGIN
UPDATE A SET COL1=CASE WHEN d.COL1 IS NULL THEN i.COL1 ELSE d.COL1 END
FROM TES1 A
INNER JOIN DELETED d ON A.ID = d.ID
INNER JOIN INSERTED i ON A.ID = i.ID;
END
示例数据
UPDATE TES1 SET COL1 = NULL WHERE ID=1;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'A' WHERE ID=1;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'B' WHERE ID=2;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'C' WHERE ID=2;
SELECT * FROM TES1;
您可以创建一个仅对新值有效的CHECK
约束。
ALTER TABLE [dbo].[Test] WITH NOCHECK ADD CONSTRAINT [CK_Test] CHECK (([Col1] IS NOT NULL))
GO
ALTER TABLE [dbo].[Test] CHECK CONSTRAINT [CK_Test]
GO
WITH NOCHECK
选项意味着即使 table 具有 NULL
值,约束也将成功创建。
但是,在创建此约束后,尝试插入新的 NULL
值或将现有值更新为 NULL
将失败。
我有一栏Col1 nvarchar(10) null
我必须编写检查约束或触发器(我认为使用检查约束是不可能的),当且仅当某些数据输入到字段中时,才会将 Col1
从 null 更改为 not null或者,更确切地说,在向字段中输入一些非空值后,它将拒绝该列获得空值。
这是因为应用程序首先检查该字段是否为空,如果是,则向其添加一些值。之后该字段不能改回空值。
现在我有以下内容:
create trigger [TRG_Col1_NotNull] on my.Table
instead of update
as
begin
if exists (
select * from inserted as i
where i.Col1 is null
)
raiserror ('You can not change the value of Col1 to null', 16, 1)
rollback transaction
end
这是最好的(甚至是正确的)方法吗?或者是否有更好更简单的解决方案(也许以某种方式检查约束)?
好的!更新!
应用程序是这样工作的:
它首先将数据保存到 table 中的 PK column, Col1, Col2, Col3
值 1, null, text, date
。之后它检查 Col1
是否为 null 并读取 PK column
并将其值写入 Col1
。所以我得到 1, 1, text, data
.
这可以满足您的要求(我知道:它是在 UPDATE 之后,所以实际上,您将更改值两次,但我不会使用 AFTER/INSTEAD:如果应该更新其他值怎么办?) .
CREATE TABLE TES1 (ID INT, COL1 VARCHAR(10));
INSERT INTO TES1 VALUES (1,'X');
INSERT INTO TES1 VALUES (2,NULL);
CREATE TRIGGER TRG1 ON TES1
AFTER UPDATE
AS
BEGIN
UPDATE A SET COL1=CASE WHEN d.COL1 IS NULL THEN i.COL1 ELSE d.COL1 END
FROM TES1 A
INNER JOIN DELETED d ON A.ID = d.ID
INNER JOIN INSERTED i ON A.ID = i.ID;
END
示例数据
UPDATE TES1 SET COL1 = NULL WHERE ID=1;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'A' WHERE ID=1;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'B' WHERE ID=2;
SELECT * FROM TES1;
UPDATE TES1 SET COL1 = 'C' WHERE ID=2;
SELECT * FROM TES1;
您可以创建一个仅对新值有效的CHECK
约束。
ALTER TABLE [dbo].[Test] WITH NOCHECK ADD CONSTRAINT [CK_Test] CHECK (([Col1] IS NOT NULL))
GO
ALTER TABLE [dbo].[Test] CHECK CONSTRAINT [CK_Test]
GO
WITH NOCHECK
选项意味着即使 table 具有 NULL
值,约束也将成功创建。
但是,在创建此约束后,尝试插入新的 NULL
值或将现有值更新为 NULL
将失败。