我想知道在创建表时是否有一种方法可以将默认值分配给列(如果该值为null)。 我知道您可以使用语法DEFAULT,但这仅适用于缺少该值的情况。有没有类似的方法,您可以说当NULL时将添加默认值而不使用触发器。
CREATE TABLE DBO.TESTS
(
TEST VARCHAR(100) DEFAULT(ISNULL('test',NULL)),
NUM INT
)
这是一个测试,我正在看的东西是什么?
更新: 输入示例
INSERT INTO TESTS (TEST,NUM)
VALUES (NULL,1)
在“ NULL”是我希望输入值“ test”的地方。但是如果我要执行以下操作
INSERT INTO TESTS (NUM)
VALUES (1)
这还将在“ TEST”列中输入“ test”的值。
我希望这会有所帮助。
答案 0 :(得分:0)
您可以向表中添加默认约束,如果插入没有值,则该约束将自动为列添加设置值:
CREATE TABLE DBO.TESTS
(
TEST VARCHAR(100),
NUM INT
)
ALTER TABLE [DBO].[TESTS] ADD CONSTRAINT [DF_TESTS_TEST] DEFAULT (N'default_value_goes_here') FOR [TEST]
INSERT INTO [DBO].[TESTS] VALUES (NULL, 1)
INSERT INTO [DBO].[TESTS] (num) VALUES (2)
结果
NULL 1
'default_value_goes_here' 2
如果要在插入过程中检查,可以使用COALESCE
DECLARE @insertValue VARCHAR(100)
SET @insertValue = NULL
INSERT INTO DBO.TESTS VALUES (COALESCE (@insertValue, 'defaultValue'), 1);
答案 1 :(得分:0)
最重要的是,该列应为不可为空的默认值。
可以在插入/更新的触发器中将空值替换为默认值,但这没有任何意义-首先是因为这意味着每个更新/插入都必须做额外的工作,其次是因为这样做无法将null插入列(除非禁用了触发器),为什么首先要允许null?这是一个错误,只会使任何尝试使用该表的人感到困惑。
从用户方面考虑-当您将null
发送到可为空的列时,您期望它是null
,就不会包含任何值。
如果运行此插入语句:
INSERT INTO TESTS (TEST,NUM)
VALUES (NULL,1)
您希望表格包含其中Test
为null
且num
= 1的行。
您不希望Test
列包含默认值。
答案 2 :(得分:0)
是的,有一种方法可以做您想要的事情。这称为触发器。您必须定义一个触发器,当将NULL
插入到列中时,该触发器将设置值。
如果使用INSTEAD OF
触发器,则仍可以将列声明为NOT NULL
。触发器将负责分配一个值,因此不会违反约束。
因此,您可以执行此操作。为什么要这样做是另一个问题。也许您不熟悉DEFAULT
关键字,该关键字允许使用VALUES()
子句插入默认值。在INSERT
的{{3}}中对此进行了解释。
答案 3 :(得分:-1)
为列提供值时,包括<Grid Padding="15,7,15,10" RowSpacing="5">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
</Grid>
,将使用该值。 NULL
仍然是一个值,只是一个未知值。仅在传递 no 值时使用NULL
值(正如我刚才说的,DEFAULT
是一个值,因此不计算在内)。
如果您不想在表中使用NULL
,则可以通过将您的列设置为NULL
来停止提供它们的人:
NOT NULL