CREATE DEFAULT (Transact-SQL)
Создает объект «Значение по умолчанию». Если этот объект привязан к столбцу или псевдониму типа данных, он указывает значение, которое должно вставляться в столбец (или во все столбцы псевдонима типа данных), если при вставке значение не задано явно.
В будущей версии Microsoft SQL Server этот компонент будет удален. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Вместо них используйте определения значений по умолчанию, созданные с помощью ключевого слова DEFAULT инструкций ALTER TABLE и CREATE TABLE.
Синтаксис
CREATE DEFAULT [ schema_name . ] default_name AS constant_expression [ ; ]
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
schema_name
Имя схемы, которой принадлежит значение по умолчанию.
default_name
Имя значения по умолчанию. Имена значений по умолчанию должны соответствовать правилам для идентификаторов. Указывать имя владельца по умолчанию не обязательно.
constant_expression
Выражение, содержащее только постоянные значения (не может включать имена столбцов или других объектов баз данных). Вы можете использовать любые константы, встроенные функции или математические выражения, за исключением тех, которые содержат типы данных псевдонимов. Определяемые пользователем функции нельзя использовать. Константы символьного типа и даты необходимо заключать в одинарные кавычки (‘). Константы, имеющие тип денежных данных, а также целочисленные и с плавающей точкой в кавычки не заключаются. Двоичные данные должны сопровождаться знаком 0x, а денежные данные — знаком доллара ($). Тип значения по умолчанию должен соответствовать типу данных столбца.
Замечания
Имя по умолчанию может быть создано только в текущей базе данных. Внутри базы данных имена по умолчанию должны быть уникальны в схеме. Чтобы созданное значение по умолчанию привязать к типу данных столбца или псевдонима, используйте sp_bindefault.
Если значение по умолчанию не совместимо с форматом столбца, к которому оно привязывается, то SQL Server формирует сообщение об ошибке при попытке применить значение по умолчанию. Например, значение N/A не может быть использовано по умолчанию для столбца, содержащего числовые данные.
Если значение является слишком длинным для столбца, к которому оно привязывается, то происходит его усечение.
Инструкции CREATE DEFAULT не могут использоваться в одном пакете с другими инструкциями Transact-SQL.
Перед созданием нового значения по умолчанию необходимо удалить старое значение с таким же именем, предварительно удалив все его связи с помощью sp_unbindefault.
Каждому столбцу соответствуют значение по умолчанию и связанное с ним правило, причем значение по умолчанию должно соответствовать правилу. Если значение по умолчанию противоречит правилу, они никогда не будет применяться, а SQL Server будет создавать ошибку при каждой попытке вставить его.
При привязке к столбцу значение по умолчанию вставляется при следующих условиях.
- Значение вставляется неявным образом.
- При выполнении функции INSERT для вставки значений по умолчанию используются ключевые слова DEFAULT VALUES или DEFAULT.
Если при создании столбца было указано NOT NULL и не были созданы значения по умолчанию, то при попытке записи в данный столбец будет выдаваться сообщение об ошибке. В следующей таблице представлена связь между фактом существования значения по умолчанию и определением столбца как NULL или NOT NULL. Записи таблицы отображают результаты.
| Определение столбца | Нет записи, значение по умолчанию отсутствует | Нет записи, присвоено значение по умолчанию | Введено NULL, значение по умолчанию отсутствует | Введено NULL, значение по умолчанию |
|---|---|---|---|---|
| NULL | NULL | default | NULL | NULL |
| NOT NULL | Ошибка | default | error | error |
Чтобы переименовать значение по умолчанию, используйте sp_rename. Чтобы получить отчет о значении по умолчанию, используйте sp_help.
Разрешения
Чтобы использовать команду CREATE DEFAULT, пользователь должен обладать разрешением CREATE DEFAULT в текущей базе данных и разрешением ALTER на схему, в которой создается значение по умолчанию.
Примеры
А. Создание простого символьного значения по умолчанию
В следующем примере создается символьное значение по умолчанию с именем unknown .
USE AdventureWorks2022; GO CREATE DEFAULT phonedflt AS 'unknown';
B. Привязка значения по умолчанию
При выполнении следующего примера производится привязка созданного в примере A значения по умолчанию. Значение по умолчанию используется в случае, когда в столбце Phone таблицы Contact нет записи.
Пропуск записи отличается от явного указания значения NULL в инструкции INSERT.
Выполнение следующей инструкции Transact-SQL заканчивается сбоем, так как не существует значения по умолчанию с именем phonedflt . Данный пример служит только для демонстрационных целей.
USE AdventureWorks2022; GO sp_bindefault 'phonedflt', 'Person.PersonPhone.PhoneNumber';
Можно ли значение по умолчанию для одного столбца быть другим столбцом?
Есть таблица product . Если в столбце description не введено значения, то хотел бы, чтобы оно по умолчанию было равно значению в столбце product_name . То есть, что то подобное:
CONSTRAINT def_desc DEFAULT product.product_name FOR description;
Но это конечно не работает. Возможно ли вообще это? Свободный перевод вопроса Can the default value of one column be another column in SQL? от участника @uckocaman
Отслеживать
задан 19 дек 2020 в 21:31
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
ассоциация:stackoverflow.com/q/65370628
19 дек 2020 в 21:33
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Нет. Значение по умолчанию может быть или литералом, или (в общем случае) детерминированой функцией, то есть, результат которoй не меняется при каждом вызове с теми же параметрами.
Логической проблемой при использовании другого столбца — что должно стать значением при изменении столбца, на который делается ссылка. Если, допустим, так будет работать:
create table t ( x int, y int default x); insert into t (x) values (1); update t set x = 2;
Что теперь ожидается в столбце y , значение 1 or 2 ?
Если надо, чтобы y было 2 , то можно воспользоваться виртуальным столбцом с вычисляемым значением.
Отслеживать
ответ дан 19 дек 2020 в 21:31
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
Нет, значение по-умолчанию для столбца не может быть значением другого столбца.
Можно конечно воспользоваться триггером для присвоения столбцу с NULL значения другого столбца, но гораздо проще и лучше будет решение — объявить столбец как NOT NULL , и тем самым принудить при вставке задавать значение «по-умолчанию» явно.
create table product (name varchar2 (8), description varchar2 (32) not null); insert into product (name) values ('product1'); ORA-01400: cannot insert NULL into ("DB"."PRODUCT"."DESCRIPTION") declare name product.name%type := 'product1'; description product.description%type; begin insert into product values (name, coalesce (description, name)); end; / select * from product / NAME DESCRIPTION -------- -------------------------------- product1 product1
Указание значений по умолчанию для столбцов
С помощью СРЕДЫ SQL Server Management Studio можно указать значение по умолчанию, которое будет введено в столбец таблицы. По умолчанию можно задать с помощью обозревателя объектов SSMS или выполнения Transact-SQL.
Если значение по умолчанию не задано столбцу и пользователь оставляет столбец пустым, происходит следующее:
- если активирована поддержка значений NULL, в столбец вставляется значение NULL ;
- если поддержка значений NULL не активирована, столбец остается пустым, но пользователь не сможет сохранить строку, пока не предоставит какое-либо значение.
Ограничения
Перед началом работы необходимо учесть следующие ограничения:
- Если данные, введенные в поле Значение по умолчанию , заменяют связанное со столбцом значение по умолчанию (которое отображается без скобок), то будет предложено отменить привязку значения по умолчанию и заменить его новым значением.
- При вводе текстовых строк заключайте их в одинарные кавычки (‘); не используйте двойные кавычки («), потому что они зарезервированы для идентификаторов.
- Чтобы задать численное значение по умолчанию, введите число без одинарных кавычек.
- Чтобы задать объект или функцию, введите имя объекта или функции без двойных кавычек.
В Azure Synapse Analytics для ограничения по умолчанию можно использовать только константы. Выражение нельзя использовать с ограничением по умолчанию.
Разрешения
Для выполнения действий, описанных в этой статье, требуется разрешение ALTER для таблицы.
Использование SSMS для указания значения по умолчанию
Обозреватель объектов в SSMS можно использовать для указания значения по умолчанию для столбца таблицы. Для этого выполните следующие шаги:
- Подключитесь к экземпляру SQL Server в SSMS.
- В обозревателе объектов щелкните правой кнопкой мыши таблицу со столбцами, масштаб которых необходимо изменить, и выберите Конструктор.
- Выберите столбец, для которого нужно задать значение по умолчанию.
- На вкладке Свойства столбца введите новое значение по умолчанию в свойстве Значение по умолчанию или привязка .
Заметка Чтобы задать численное значение по умолчанию, введите число. В случае объекта или функции нужно ввести его или ее имя. Чтобы задать алфавитно-цифровое значение по умолчанию, введите его, заключив в одинарные кавычки.
Использование Transact-SQL для указания значения по умолчанию
Существуют различные способы указания значения по умолчанию для столбца с помощью отправки T-SQL.
ALTER TABLE (T-SQL)
- В обозревателе объектов подключитесь к экземпляру ядра СУБД.
- На стандартной панели выберите пункт Создать запрос.
- Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.
CREATE TABLE dbo.doc_exz (column_a INT, column_b INT); -- Allows nulls. GO INSERT INTO dbo.doc_exz (column_a) VALUES (7); GO ALTER TABLE dbo.doc_exz ADD CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50 FOR column_b; GO
CREATE TABLE (T-SQL)
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT DEFAULT 50);
CONSTRAINT (T-SQL) с именем
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50);
Далее
Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).
Значения по умолчанию
Для столбца может быть задано значение по умолчанию, т.е. значение, которое будет подставляться в том случае, когда оператор вставки не предоставляет значения для этого столбца. Как правило, значением по умолчанию выбирается наиболее часто встречающееся значение.
Пусть для нашей базы данных наибольшая часть моделей представляет собой ПК. Давайте установим для столбца type значение по умолчанию ‘PC’. Добавить значение по умолчанию можно с помощью оператора ALTER TABLE . Согласно стандарту, оператор для нашего примера имел бы вид:
Однако Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server не поддерживает в данном случае стандартный синтаксис; в диалекте T-SQL аналогичную операцию можно выполнить так:
Теперь при добавлении в таблицу Product модели ПК мы можем не указывать тип.
Заметим, что значением по умолчанию может быть не только литеральная константа, но и функция без параметров. В частности, мы можем использовать функцию CURRENT_TIMESTAMP , возвращающую текущее значение даты-времени. Давайте добавим столбец в таблицу Product, который будет содержать время, соответствующее выполнению операции добавления модели в БД.
Добавим модель 1125 производителя А
и посмотрим на результат
1. Если значение по умолчанию не указано, то подразумевается default NULL, т.е. NULL-значение. Естественно, это значение по умолчанию может быть использовано только в том случае, если на столбце нет ограничения NOT NULL.
2. Если добавить столбец в существующую таблицу, то он, согласно стандарту, будет заполнен значениями по умолчанию для имеющихся строк. В SQL Server поведение при добавлении столбца несколько отличается от стандартного. Если выполнить запрос
который добавляет в таблицу Product столбец available со значением по умолчанию ‘yes’, то, как это ни странно, столбец будет заполнен NULL-значениями. Чтобы «заставить» сервер заполнить столбец значениями ‘yes’, можно использовать один из двух способов:
a). Запретить NULL, т.е. написать такой запрос:
Ясно, что этот способ не годится, если столбец допускает значения NULL.
b). Использовать специальное предложение WITH VALUES :