我正在将数据库从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}}
答案 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()
)
无需触发器。