【问题标题】:MSSQL Server INSERT NULL, but insert GetDate() in DATETIMEMSSQL Server INSERT NULL,但在 DATETIME 中插入 GetDate()
【发布时间】: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


【解决方案1】:

我假设您已经在 SQL Server 列上设置了默认值,并且您不允许 NULL,默认约束不会在 NULL 值上触发,它们只会在未指定值时触发,或者如果您指定在 insert 上插入默认值,如下所示:

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

这样做会导致默认值触发,您不必更改模型。

【讨论】:

  • 我想知道为什么在这种情况下 MySQL 和 SQL Server 的行为会有所不同,因为我认为这正是 MySQL 应该如何工作的......
  • 谢谢!这是在正确的轨道上。但是,现在的问题是如何将 DEFAULT 作为 PHP 的值插入。我正在使用活动记录。如果我使用引号,它假定我正在尝试插入一个字符串。
【解决方案2】:

我不知道如何在代码点火器中表达这一点,但是在 SQL Server 中,这真的很容易:

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

不需要触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多