可以对sql中的表列在NULL上分配默认值

时间:2018-07-04 08:13:44

标签: sql sql-server tsql

我想知道在创建表时是否有一种方法可以将默认值分配给列(如果该值为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”的值。

我希望这会有所帮助。

4 个答案:

答案 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)

您希望表格包含其中Testnullnum = 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