【问题标题】:Get the value from a default constraint从默认约束中获取值
【发布时间】:2026-01-27 05:20:03
【问题描述】:

我需要将默认约束值从 0 更改为 1。这很容易做到:

ALTER TABLE table DROP CONSTRAINT X
ALTER TABLE table ADD CONSTRAINT X default (1) for table.column

问题是我不想每次在我的数据库上运行 modelupdate 时都删除并创建一个新的约束。这就是为什么我要运行这段代码 IF 约束的值为 0。

是否可以在 SQL 中检查默认约束的值,如果可以,如何?

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或者完全是其他东西。
  • 对不起!现在它在那里。
  • "我不想每次重新创建数据库时都删除并创建一个新的约束" -- 当你重新创建数据库时,你不必先删除约束,因为它还不存在。当你重新创建你的数据库时,你总是需要创建你的约束。
  • SELECT * FROM sys.default_constraints \\\ 定义
  • 是的,我问的问题有点错误。每次我们对数据库进行更新时,我们都会将其提交到一个大型 SQL 文件中,以检查表是否存在或列是否存在。如果没有,则创建。我希望约束也能发生同样的情况。

标签: sql sql-server constraints default-constraint


【解决方案1】:

你可以像这样找到默认约束的“定义”:

SELECT 
    DefaultConstraintName = df.name,
    df.definition
FROM 
    sys.default_constraints df
INNER JOIN 
    sys.tables t ON df.parent_object_id = t.object_id
INNER JOIN 
    sys.columns c ON c.object_id = df.parent_object_id AND df.parent_column_id = c.column_id
WHERE 
    t.Name = N'YourTableNameHere'
    AND c.Name = N'YourColumnNameHere'

但是,这将返回您的默认值的字符串表示形式 - 而不是实际值本身(无论它是什么数据类型)。但这可能会帮助你找到你需要的东西

【讨论】:

  • 谢谢。我简化了一点:如果存在(从 sys.default_constraints 中选择'x',其中 name='DF' and definition ='((0))')
  • @user3025336 - 当然,您的简化回答了一个不同的问题 - “是否存在默认约束,默认值为 0 应用于 anyany 列/i> 这个数据库中的表?” - 这可能足以满足您的目的,但通常不是一个好的解决方案。
  • @user3025336: 有效 - if 你的数据库中只有一个默认约束,其值为 ((0)) - 我有 许多 默认值约束,因此我需要具体说明我感兴趣的默认约束(对于什么表和列)......
【解决方案2】:

您可以从下面的 information_schema 视图中看到该列的默认值。

SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' and COLUMN_NAME = 'ColumnName'

【讨论】: