【发布时间】:2016-03-04 10:11:01
【问题描述】:
我正在将数据库从 MySQL 迁移到 MSSQL。 [MySQL] 我有一个 CHANGEDATE 列,它是 TIMESTAMP,默认为 CURRENT_TIMESTAMP [MSSQL] 我有与 DATETIME 相同的 CHANGEDATE 列,并添加了 GETDATE() 的默认约束
代码库是使用 CodeIgniter 的 PHP。我希望始终设置该列,因此我不允许在任一 DBMS 中使用 NULL。
当我使用 MySQL 插入时,PHP 模型 CHANGEDATE 的属性默认为 NULL。这会触发默认值,并将列条目设置为 CURRENT_TIMESTAMP。但是,当配置为 MSSQL 时,相同的代码会抛出一个错误,即列中不允许 NULL,这是有效的,但我宁愿像 MySQL 这样的 MSSQL 函数并在该实例中插入 GETDATE() 的值。
如果我执行unset($model->CHANGEDATE) 或从我的模型中删除该属性,那么它会按预期工作,但我想知道是否有一种方法可以仅使用 MSSQL 而不是更新我的所有 PHP 模型来解决这个问题。
class model {
public $CHANGEDATE;
...
}
错误(如所述):
[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)
更新: CI 应该创建对 DBMS 特定关键字的支持,正如@steoleary 在他的回答中所说的那样(为此我标记了他的正确)。但是,我发现在我的情况下最好的解决方案是稍微修改核心类 DB_active_rec.php
function set(...){
...
foreach ($key as $k => $v)
{
if (is_null($v)) continue;
...
}
}
【问题讨论】:
-
能否向我们展示一下 MySQL 和 SQL Server 版本的表和约束定义?
标签: php mysql sql-server codeigniter datetime