MSSQL Server INSERT为NULL,但在DATETIME中插入GetDate()

时间:2015-11-30 17:20:16

标签: php mysql sql-server codeigniter datetime

我正在将数据库从MySQL迁移到MSSQL。 [MySQL]我有一个TIMEDAMP的CHANGEDATE列,默认为CURRENT_TIMESTAMP [MSSQL]我有与DATETIME相同的CHANGEDATE列,并添加了GETDATE()的默认约束

代码库是使用CodeIgniter的PHP。我希望始终设置列,这样我就不会在DBMS中允许NULL。

当我使用MySQL插入时,PHP模型CHANGEDATE的属性默认为NULL。这将触发默认值,列条目将设置为CURRENT_TIMESTAMP。配置到MSSQL时相同的代码会抛出一个错误,即列中不允许NULL,这是有效的,但我宁愿像MySQL一样使用MSSQL函数,并在该实例中插入GETDATE()的值。

如果我做[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Cannot insert the value NULL into column 'CHANGEDATE'; column does not allow nulls. INSERT fails. INSERT INTO Logs (..., CHANGEDATE, CHANGEBY) VALUES (..., NULL, NULL)或从我的模型中删除属性,那么它按预期工作,但我想知道是否有办法解决这个问题只是使用MSSQL而不是更新我所有的PHP模型。< / p>

function set(...){
...
foreach ($key as $k => $v)
{
if (is_null($v)) continue;
...
}
}

错误(如上所述): {{1}}

更新: CI应该创建对DBMS特定关键字的支持,如@steoleary在他的回答中所述(我为此标记了正确的)。但是,我发现在我的情况下最好的解决方案是稍微修改核心类DB_active_rec.php

{{1}}

2 个答案:

答案 0 :(得分:3)

我假设您已经在SQL服务器列上拥有默认设置,并且您不允许使用NULL,因此无法触发NULL值,只有在未指定值时才会触发,或者如果您指定在插入上插入默认值,如下所示:

INSERT INTO [dbo].[table]
           ([col1]
           ,[col2]
           ,[col3]
           ,[col4]) --Column with default constraint
     VALUES
           ('bob',
           'bobson',
           1,
           DEFAULT) --default keyword

这样做会导致默认设置触发,您不应该更改模型。

答案 1 :(得分:-1)

我不知道如何在代码点火器中表达这一点,但在SQL Server中,它非常简单:

create table . . .  (
    changedate not null datetime default getdate()
)

无需触发器。