【问题标题】:T-SQL to add a column bound to a existing default constraintT-SQL 添加绑定到现有默认约束的列
【发布时间】:2013-12-17 13:05:48
【问题描述】:

我在数据库中创建了一个 DEFAULT 约束,我想在多个表之间共享它,并且我想编写一个独特的 alter table 语句来在这些表中添加一个字段,如下所示:

ALTER TABLE MyTable ADD MyField NOT NULL DEFAULT(DF_EXISTING_DEFAULT)

出现以下错误:

Msg 128, Level 15, State 1, Line 1
The name "DF_EXISTING_DEFAULT" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

注意DF_EXISTING_DEFAULT中已经定义了默认值,我不想再写了。我该怎么做?有什么理由我不应该这样做?是t-sql的限制吗?

【问题讨论】:

    标签: sql-server tsql constraints default alter-table


    【解决方案1】:

    您实际上可以这样做,但这样做的机制已被弃用,因此不应使用。

    你可以CREATE DEFAULT对象,然后使用sp_bindefault

    没有不推荐的替代品。如果默认的逻辑很复杂,您可以将其放在标量 UDF 中以避免重复。

    【讨论】:

    • 嗯,默认值并不复杂(例如 DEFAULT('A simple text'),但它可以在将来更改。在这种情况下,UDF 是避免“代码重复”的唯一方法) ? 此时的主要目标是保持一个单一默认值,避免那些sql自动约束命名。
    • @natenho - 是的。默认的 约束 不能在列之间共享,并且 SQL Server 中没有用户定义的全局变量,因此为了避免在约束定义本身中重复 'A simple text',这是唯一的方法。您也可以将其存储在表中,但这也需要 UDF 才能访问。存储在表中的优点可能是更容易维护(更改 UDF 定义将需要删除所有引用它的默认值),但在 UDF 中硬编码会更有效,并且在约束定义本身中更有效。所以交易性能与可维护性。
    • 关于“不能共享”...当您在多个表/列中对同一个 DF 使用 sp_binddefault 时,您不是共享约束吗?至少我看不到正在创建新的约束。
    • @natenho - 共享一个默认的 object 而不是默认的 constraint。尝试绑定约束会给出Cannot bind default 'X'. The default must be created using the CREATE DEFAULT statement.(至少在我的 SQL Server 版本上)
    • 是的,这是一个(已弃用的)默认对象。不是(不推荐使用的)默认约束
    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多