Можно назначить значение по умолчанию для NULL для столбца таблицы в SQL - PullRequest
0 голосов
/ 04 июля 2018

Мне интересно, есть ли способ, когда при создании таблицы вы можете присвоить столбцу значение по умолчанию, если значение равно нулю. Я понимаю, что вы можете использовать синтаксис DEFAULT, однако это только для случаев, когда значение отсутствует. Есть ли способ, похожий на этот, который вы можете сказать, когда NULL добавит значение по умолчанию без использования триггера.

CREATE TABLE DBO.TESTS
(
TEST VARCHAR(100) DEFAULT(ISNULL('test',NULL)),
NUM INT
)

Это тест и на что я смотрел?

UPDATE: Пример ввода

INSERT INTO TESTS (TEST,NUM)
VALUES (NULL,1)

Где "NULL", я бы хотел, чтобы ввести значение "test". Но также, если бы я должен был сделать следующее

INSERT INTO TESTS (NUM)
VALUES (1)

Это также введет значение «test» в столбец «TEST».

Надеюсь, это поможет.

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Да, есть способ сделать то, что вы хотите. Это называется триггером. Вам необходимо определить триггер, который устанавливает значение, когда в столбец вставляется NULL.

Если вы используете триггер INSTEAD OF, вы все равно можете объявить столбец как NOT NULL. Триггер позаботится о назначении значения, чтобы ограничение не нарушалось.

Итак, вы можете сделать это. Почему вы хотели бы сделать это другой вопрос. Возможно, вы не знакомы с ключевым словом DEFAULT, которое позволяет вставлять значения по умолчанию с помощью предложения VALUES(). Это объясняется в документации для INSERT.

0 голосов
/ 04 июля 2018

При предоставлении значения для столбца, включая NULL, будет использоваться это значение. NULL все еще значение, просто неизвестное значение. Значение DEFAULT будет использоваться только в том случае, если передано значение без (которое, как я только что сказал, NULL - это значение, поэтому не считается).

Если вы не хотите, чтобы NULL в вашей таблице, вместо этого остановите людей, предоставляющих их, установив для вашего столбца значение NOT NULL:

CREATE TABLE dbo.TestTable (ID int, String varchar(100) NOT NULL DEFAULT 'test')
GO
--INSERT is successful, String has a value of 'test'
INSERT INTO dbo.TestTable (ID)
VALUES(1);
GO
--INSERT fails, String cannot have a value of NULL
INSERT INTO dbo.TestTable (ID,
                           String)
VALUES(2,NULL);
GO
SELECT *
FROM dbo.TestTable;
GO
DROP TABLE dbo.TestTable;
GO
0 голосов
/ 04 июля 2018

Суть в том, что столбец должен быть не обнуляемым со значением по умолчанию.
Можно заменить нулевые значения значениями по умолчанию в триггере для вставки / обновления, но это не имеет никакого смысла - во-первых, потому что это означает, что каждое обновление / вставка будет выполнять эту дополнительную работу, а во-вторых, потому что это сделает это невозможно вставить ноль в столбец (если триггеры не отключены), так почему же в первую очередь разрешить нули? Это ошибка, которая только сбивает с толку тех, кто пытается использовать эту таблицу.

Подумайте об этом со стороны пользователя - когда вы отправляете null в обнуляемый столбец, вы ожидаете, что оно будет null, вы не ожидаете, что оно будет содержать значение.

Если вы запустите этот оператор вставки:

INSERT INTO TESTS (TEST,NUM)
VALUES (NULL,1)

Вы ожидаете, что таблица будет содержать строку, где Test равно null и num = 1.
Вы не ожидаете, что столбец Test будет содержать значение по умолчанию.

0 голосов
/ 04 июля 2018

Вы можете добавить ограничение по умолчанию к вашей таблице, которое автоматически добавит заданное значение для столбца, если для вставки нет значения для него:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...