在非空列上插入后触发

我有一个包含两个not nullCreatedUpdated

我写了相应的触发器

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
AFTER INSERT
AS
BEGIN
  UPDATE Category
  SET Created = GETDATE(), Updated = GETDATE()
  FROM inserted
  WHERE Category.ID = inserted.ID;
END

ALTER TRIGGER [dbo].[tr_category_updated] ON [dbo].[Category]
AFTER UPDATE
AS
BEGIN
  UPDATE Category
  SET Updated = GETDATE()
    FROM inserted
        inner join [dbo].[Category] c on c.ID = inserted.ID
END

但如果我插入一个新行,则会出现错误

无法将值NULL插入“创建”列,“表”类别; 列不允许有空值。 INSERT失败。

插入命令:

INSERT INTO [Category]([Name], [ShowInMenu], [Deleted])
     VALUES ('category1', 0, 0)

我怎样才能写这样的触发器没有设置这些列允许为空?


像这样修改你的表格:

ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0;

将创建的列的默认值设置为0.不幸的是,MySQL不允许在一个表中使用默认CURRENT_TIMESTAMP两个时间戳列。 为了克服这个问题,你只需要在created列中插入一个NULL值,并且你将有两列到当前的时间戳。

INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL);

或者您将默认设置为有效的时间戳

ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00';

并像这样修改你的触发器:

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
AFTER INSERT
AS
BEGIN
  UPDATE Category
  SET Created = GETDATE()
/*  FROM inserted */ /*don't know where you got that from, do you port from SQL Server?*/
  WHERE Category.ID = NEW.ID;
END

发生错误是因为触发器仅在插入后工作,并且您可能不会在插入时插入列值CreatedUpdated

因此,为了消除错误,您可以插入/填充CreatedUpdated的列以及插入。 或者您可以添加列的默认值属性。 详情请查看链接

将具有默认值的列添加到SQL Server中的现有表

指定列的默认值


可能使用INSTEAD OF触发器

CREATE TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category]
INSTEAD OF INSERT
AS
BEGIN
  INSERT Category(Name, ShowInMenu, Deleted, Created, Updated)
  SELECT Name, ShowInMenu, Deleted, GETDATE(), GETDATE()
  FROM inserted i
END
链接地址: http://www.djcxy.com/p/24719.html

上一篇: Trigger after insert on not null column

下一篇: In SQL, How to add values after add a new column in the existing table?