插入一些数据时,将列从NULL更改为NOT NULL

我有一列Col1 nvarchar(10) null

我必须编写一个检查约束或触发器(我认为检查约束是不可能的),当且仅当某些数据输入到字段中时, Col1才会将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

这是做到这一点的最好(或者甚至是正确的)方式吗?或者有没有更好更简单的解决方案(可能是检查约束)?

好! 更新! 应用程序的工作原理如下:首先将数据保存到PK column, Col1, Col2, Col3表格PK column, Col1, Col2, Col3值为1, null, text, date 。 之后,它会检查Col1是否为空,并读取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选项表示即使表具有NULL值,约束也会成功创建。

但是,在创建此约束之后,尝试插入新的NULL值或将现有值更新为NULL将失败。

链接地址: http://www.djcxy.com/p/76289.html

上一篇: Changing the column from NULL to NOT NULL when some data is inserted

下一篇: Entity Framework object reference not set when getting data from table