【问题标题】:SQL Server suddenly not respecting default valuesSQL Server 突然不尊重默认值
【发布时间】:2019-05-06 05:58:27
【问题描述】:

我正在运行一个脚本来使用 SQLAlchamy 在 SQL Server 2017 数据库上填充一个表。该脚本在几周前完美运行。

基本上,服务器似乎没有在不可为空的字段上填充默认值。

例如,当我运行以下语句(由 SQLA 呈现)时:

 INSERT INTO concept
        (
                    retired,
                    short_name,
                    description,
                    form_text,
                    datatype_id,
                    class_id,
                    is_set,
                    creator,
                    date_created,
                    version,
                    changed_by,
                    date_changed,
                    retired_by,
                    date_retired,
                    retire_reason,
                    uuid,
                    note_regex
        )
        VALUES
        (
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?
        )'] [parameters: (0,
                    'ck',
                    'creatine phosphokinase',
                    None,
                    14,
                    49,
                    0,
                    0,
                    None,
                    None,
                    None,
                    None,
                    None,
                    None,
                    None,
                    'cf6443ff-f2a1-49ab-96e3-c5d6fac362ed', None)] 

我收到错误:

Cannot insert the value NULL into column 'date_created',
table 'myositis_longetudinal_cohort.dbo.concept'; column does not allow
nulls. INSERT fails. (515)

这让我很困惑,因为 date_created 字段的默认值为 getdate()

这是约束语句:

ALTER TABLE [dbo].[concept]
ADD CONSTRAINT [DF__concept__date_cr__62AFA012] DEFAULT (Getdate()) FOR
[date_created]  

我是 SQL Server 的新手,不确定我可能缺少什么。服务器于 2018 年 11 月 15 日更新,但我在更新中没有看到任何可以解释更改的内容。

提前感谢您的帮助!

【问题讨论】:

  • DEFAULTconstraint 仅在您不为其提供值的情况下“启动”。您在 INSERT 语句中提供它,并且我 假设 传递值 NULL,因此出现错误。 db<>fiddle
  • 在不相关的笔记上。空格和换行符对于使 SQL 可读性非常重要。您的INSERT 声明不容易阅读,因为它都在一行中。
  • @Larnu。谢谢!有没有理由让这在以前有效?那是我很难理解的部分。
  • 它以前不应该工作。您的 INSERT 语句已更改,或者您的列的 NULLability。
  • @Larnu,谢谢。我倾向于使用 Python 而不是 SQL,所以我只是粘贴原始输出。我更新了我的问题以更清楚。

标签: sql sql-server tsql sqlalchemy


【解决方案1】:
    INSERT INTO concept
    (
                retired,
                short_name,
                description,
                form_text,
                datatype_id,
                class_id,
                is_set,
                creator,
                date_created,  <--SPECIFYING HERE MEANS DEFAULT WON'T BE USED
                version,
                changed_by,
                date_changed,
                retired_by,
                date_retired,
                retire_reason,
                uuid,
                note_regex
    )

以及参数:

[parameters: (
 0,                         <-- retired,  
 'ck',                      <-- short_name,     
 'creatine phosphokinase',  <-- description,                         
 None,                      <-- form_text,     
 14,                        <-- datatype_id,   
 49,                        <-- class_id,   
 0,                         <-- is_set,  
 0,                         <-- creator,  
 None,                      <-- date_created   (provided with NULL)  
 None,
 None,
 None,
 None,
 None,
 None,
 'cf6443ff-f2a1-49ab-96e3-c5d6fac362ed', 
 None
 )] 

表中具有 NON_NULL_DEFAULT+NOTNULL_CONSTRAINT 的任何其他列都会出现同样的问题

至于为什么它突然开始发生的可能性:

  • SQLAlchemy 从未用于生成指定此列的插入
  • 添加了 NOT NULL 约束
  • 在传递 null 的情况下提供值的触发器已被移除、重新编码或禁用

【讨论】:

  • 谢谢,SQLA ORM Table 的设置方式发生了变化!
【解决方案2】:

感谢大家。

事实证明,这是一个 SQLAlchemy 问题。

我必须将autoload: true 添加到我的__table_args__,而不是手动定义每个列。显然,如果您不允许 SQLA 自省表,它将传递 NULL 作为值,而不是按照@larnu 和其他人的建议在生成插入语句时跳过该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多