问题标签 [default-constraint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 如何从 Db2 中的列中删除默认约束
我有一个 STUDENT_TB 表,其中包含 STUDENT_ID、NAME、AGE 列。我添加了一个带有以下命令的列:-
至于 DOB 列,我不希望它为空。现在我需要删除该默认约束。
我尝试搜索但没有成功。
问候。
c# - 如何检查列默认约束是否存在?
我想检查该列是否已具有默认约束,或者不仅具有表名和列名数据。有了该记录数,我们可以创建约束。
我们是否有任何其他属性来检查数据集中该列是否存在约束?
c# - 让 C# 将默认值插入 SQL Server
如何将INSERT
值放入存储在 SQL Server 中string[]
的值,以便忽略某些值而将存储在 SQL Server 中的值作为表上的默认约束?我需要传递什么(例如 NULL 或其他)才能使用这些默认值?
目前,我在我的代码中添加了所有默认值,并且它变得越来越庞大。
下面是我的代码:
如果一个特定Parameter.Value
的不是 null 并且 SQL Server 设置了默认值,则此代码不适用于 null。
在 SQL Server 中,这是通过省略插入语句中的值来处理的(这种省略会触发插入表的默认值,而提供 null 会产生错误)。
sql-server - 多次插入的 SQL Server 计算列错误
我在 SQL Server 2008 中有一个表 - 我们将表称为 MyTable。该表有一个名为 Status 的列,它不是计算列,定义为 varchar(40),它允许 NULL;但是,此列上还有一个 DEFAULT CONSTRAINT,默认值 = 'POOL'。我刚刚使用以下命令向表中添加了一个计算列:
如果我将记录一一插入表中(并Status
使用约束默认为“POOL”),它就可以正常工作;例如,这条 SQL 语句没有问题:
使用上面的 SQL,我最终在表中创建了一条新记录,其中 Name = 'Foo' 和 Status = 'POOL' 和 PrimaryStatus = 'POOL'
但是,如果我执行如下所示的多行 INSERT:
然后它抛出一个错误:
消息 537,级别 16,状态 2,第 1 行
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
如果我删除默认约束或计算列(或两者),多行INSERT
工作正常;但由于某种原因,同时具有约束和计算列导致多行INSERT
失败。我尝试以各种方式调整计算列来解释 NULL(尽管我认为考虑到评估的顺序并不重要),但似乎没有什么可以解决这个问题。
以前有人见过这样的东西吗?
sql - SQL Server 默认为语法
为什么 SQL Server 2012 报告的“for”附近有语法错误?
DEFAULT FOR 语法在创建表时不可用,但在更改时可用?这是一个关于更改表和添加默认约束链接的教程,但是在创建它时我无法正确使用它。
sql - 为什么向现有列添加可为空的默认约束需要这么长时间?
我有一个包含大约 4 亿行的现有表。该表包括一组bit
名为 IsModified、IsDeleted 和 IsExpired 的列。
我想为表添加一个默认约束,对于所有未来插入的行,将这些位列默认为 0。我正在尝试通过以下命令执行此操作:
我最终想返回并清理现有数据以将零值放在任何有值的地方NULL
,但我现在并不需要这样做。
只是尝试运行第一个ADD CONSTRAINT
命令已经执行了一个多小时。鉴于我没有尝试更改任何现有值,为什么要花这么长时间?
c# - SqlBulkCopy into table that Default column values fails when source DataTable row has DBNull.Value
Update: Here is my solution
I have a table defined as:
I have a DataTable
with columns that match the table column names and data types. The DataTable
is filled out with DBNull.Value
in CreatedOn
, LastUpdatedOn
and LastUpdatedUser
. ReferenceID
is already generated. When I call the following code I get the error below.
Code:
Error:
Error trying to BulkCopy table csvrf_References
System.InvalidOperationException: Column 'CreatedOn' does not allow DBNull.Value.
at System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed)
I have looked all over and I can't seem to find an answer for this. The SqlBulkCopy
class seems not to honor default values even though it says it does. What am I doing wrong here?
c# - 如何让 EF 6 在 INSERT 期间处理数据库上的 DEFAULT CONSTRAINT
我是 EF 新手(这是我的第一周),但对数据库或编程并不陌生。其他人也问过类似的问题,但我觉得它没有被问到正确的细节或解释得很清楚,因为它需要解释,所以我开始了。
问题: 如何让 Entity Framework 正确处理数据库中在执行 INSERT 时定义了 DEFAULT CONSTRAINT 的列?意思是,如果在插入操作期间我没有在模型中提供值,我如何让 EF 从其生成的 TSQL INSERT 命令中排除该列,以便数据库定义的 DEFAULT CONSTRAINT 起作用?
背景
我创建了一个简单的表,只是为了测试 Entity Framework 6 (EF6) 及其与 SQL Server 能够更新的列的交互。这利用了 IDENTITY、TIMESTAMP、COMPUTED 和一些应用了 DEFAULT CONSTRAINT 的列。
EF6 完美地处理 IDENTITY、TIMESTAMP 和 COMPUTED 列,这意味着在 INSERT 或 UPDATE(通过context.SaveChanges()
)之后 EF 将新值读回实体对象以供立即使用。
但是,对于具有 DEFAULT CONSTRAINT 的列不会发生这种情况。据我所知,这是因为当 EF 生成 TSQL 以执行 INSERT 时,它为可为空或不可为空的类型提供通用默认值,就像该列上没有定义默认约束一样。因此,显然 EF 完全忽略了默认约束的可能性。
这是我插入 DBUpdateTest 记录的 EF 代码(我只更新单个列):
这是在插入 DBUpdateTest 期间 EF 生成的 SQL(它尽职尽责地更新所有可能的列):
请注意,它非常清楚地提供了INT NOT NULL (0) 和INT NULL (null) 的默认值,这完全克服了 DEFAULT CONSTRAINT。
这就是执行 EF INSERT 命令时发生的情况,它为可空列提供 NULL,为 INT 列提供零
另一方面,如果我执行以下语句:
我会得到这样的记录
这按预期工作有一个原因:TSQL INSERT 命令没有为具有定义的 DEFAULT CONSTRAINT 的任何列提供值。
因此,如果我没有在模型对象中为它们明确设置值,我想要做的是让 EF 从 INSERT TSQL 中排除 DEFAULT CONSTRAINT 列。
我已经尝试过的事情
1. 识别默认约束? SO:如何让 EF 处理默认约束
在OnModelCreating()
我的课堂方法中DbContext
,建议我可以告诉 EF 具有 DEFAULT CONSTRAINT 的列是 COMPUTED 字段,但事实并非如此。但是,我想看看它是否会让 EF 至少在 INSERT 之后读回值(没关系,它也可能使我无法为该列分配值,这只是我所做的更多不想):
这不起作用,实际上似乎并没有什么不同(ED:实际上它确实起作用,见第 2 点)。EF 仍然生成相同的 TSQL,为列提供默认值并在此过程中击败数据库。
是否有我遗漏的标志、我忘记设置的配置项、我可以使用的函数属性、我可以创建的一些继承的类代码,以使 EF “正确处理 DEFAULT CONSTRAINT 列”?
2. 获取 OnModelCreating() 执行? SO:未调用 OnModelCreating
Janesh(下图)向我展示了如果列标记为 ,EF 将从其生成的 TSQL INSERT 命令中删除参数DatabaseGeneratedOption.Computed
。它只是对我不起作用,因为显然我使用了错误类型的连接字符串(!!!)。
这是我的 App.config,这是<connectionStrings>
我显示“坏”和“好”连接字符串的部分:
区别:起作用的使用ProviderName,System.Data.SqlClient
不起作用的使用System.Data.EntityClient
。显然 SqlClient 提供程序允许OnModelCreating()
调用该方法,这使我的使用DatabaseGeneratedOption.Computed
产生了效果。
========== 尚未解决 ==========
列上的 DEFAULT CONSTRAINTS 的目的是允许我提供(或不提供)一个值,并且仍然在数据库端得到一个有效值。我不必知道 SQL Server 正在执行此操作,也不必知道默认值是或应该是什么。这完全超出了我的控制或知识范围。
关键是,我可以选择不提供价值。我可以提供它,也可以不提供它,如果需要,我可以对每个 INSERT 执行不同的操作。
对于这种情况,使用DatabaseGeneratedOption.Computed
实际上不是一个有效的选项,因为它强制选择:“您可以始终提供一个值(因此永远不要使用数据库默认机制),或者您永远不能提供一个值(因此始终使用数据库默认机制) )”。
另外,该选项显然只用于实际的计算列,而不是用于具有默认约束的列,因为一旦应用,模型属性实际上会变为只读以用于插入和更新 - 因为这就是真正的计算列会工作。显然,这妨碍了我选择向数据库提供或不提供值的方式。
所以,我仍然要问:如何让 EF 与定义了 DEFAULT CONSTRAINT 的数据库列“正确”工作?
sql-server - 默认约束完整形式
对于每个表约束,我看到有速记形式,半速记形式和完整形式(请原谅我的命名。欢迎提出如何正确调用它们的建议)
例如
简写形式:让约束名称由 SQL Server 定义,要影响的列隐含为正在定义的列
半速记形式:显式约束名,隐含列
完整形式:两者都是明确的。允许定义与列定义分开
据我所见,完整的形式经常出现在 中ALTER TABLE
,其中约束是在之后定义的。
对于DEFAULT
约束
速记形式
半速记形式
ALTER TABLE
我在这里看到了完整的用法
但是,创建表时的全格式定义失败
有错误
消息 102,级别 15,状态 1,第 5 行 'for' 附近的语法不正确。
谁能建议为什么会发生此错误以及如何使用默认约束的完整形式定义?
sql - 从默认约束中获取值
我需要将默认约束值从 0 更改为 1。这很容易完成:
问题是我不想每次在我的数据库上运行 modelupdate 时都删除并创建一个新的约束。这就是为什么我想在约束的值为 0 时运行此代码。
是否可以检查 SQL 中默认约束的值,如果可以,如何检查?