SQL NOT NULL
По умолчанию столбец может содержать нулевые значения.
Ограничение NOT NULL заставляет столбец не принимать нулевые значения.
Это заставляет поле всегда содержать значение, что означает, что вы не можете вставить новую запись или обновить запись без добавления значения в это поле.
NOT NULL в CREATE TABLE
Следующий SQL гарантирует, что столбцы «ID», «LastName», и «FirstName» не будут принимать нулевые значения при создании таблицы «Persons»:
Пример
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
NOT NULL в ALTER TABLE
Чтобы создать ограничение NOT NULL для столбца «Age», когда таблица «Persons» уже создана, используйте следующий SQL:
ALTER TABLE Persons
MODIFY Age int NOT NULL;
Мы только что запустили
SchoolsW3 видео
курс сегодня!
Сообщить об ошибке
Если вы хотите сообщить об ошибке или внести предложение, не стесняйтесь отправлять на электронное письмо:
Ваше предложение:
Спасибо Вам за то, что помогаете!
Ваше сообщение было отправлено в SchoolsW3.
Schoolsw3 оптимизирован для бесплатного обучения, проверки и подготовки знаний. Примеры в редакторе упрощают и улучшают чтение и базовое понимание. Учебники, ссылки, примеры постоянно пересматриваются, чтобы избежать ошибок, но не возможно гарантировать полную правильность всего содержания. Некоторые страницы сайта могут быть не переведены на РУССКИЙ язык, можно отправить страницу как ошибку, так же можете самостоятельно заняться переводом. Используя данный сайт, вы соглашаетесь прочитать и принять Условия к использованию, Cookies и политика конфиденциальности.
Обработка значений NULL
Значение NULL в реляционной базе данных используется, если значение в столбце неизвестно или отсутствует. NULL не является ни пустой строкой (для типов данных character или datetime), ни нулевым значением (для числовых типов данных). В спецификации ANSI SQL-92 указано, что значение NULL должно быть одинаковым для всех типов данных, чтобы все значения NULL обрабатывались согласованно. Пространство имен System.Data.SqlTypes обеспечивает семантику со значением NULL, реализуя интерфейс INullable. Каждый из типов данных в System.Data.SqlTypes имеет собственное свойство IsNull и значение Null , которое может быть назначено экземпляру этого типа данных.
В версиях .NET Framework 2.0 и .NET Core 1.0 появилась поддержка типов, допускающих значение NULL, что позволяет программистам расширять тип значения для представления всех значений базового типа. Эти типы CLR, допускающие значение NULL, представляют экземпляр структуры Nullable. Эта возможность особенно полезна, если типы значений упакованы и распакованы, что обеспечивает улучшенную совместимость с типами объектов. Типы CLR, допускающие значение NULL, не предназначены для хранения значений NULL базы данных, так как значение NULL ANSI SQL не работает так же, как ссылка на null (или Nothing в Visual Basic). Для работы со значениями NULL в базе данных ANSI SQL используйте значения NULL System.Data.SqlTypes вместо Nullable. Дополнительные сведения о работе на C# с типами CLR, допускающими значения NULL, см. в этой статье.
Значения NULL и логика трех значений
Разрешение значений NULL в определениях столбцов вводит в приложение логику трех значений. Результатом сравнения может быть одно из трех условий:
Так как значение NULL считается неизвестным, два значения NULL, сравниваемые друг с другом, не считаются равными. В выражениях, использующих арифметические операторы, если какой-либо из операндов имеет значение NULL, результат также равен NULL.
Значения NULL и SqlBoolean
При сравнении между любыми типами System.Data.SqlTypes будет возвращаться значение SqlBoolean. Функция IsNull для каждого типа SqlType возвращает SqlBoolean и может использоваться для проверки на наличие значений NULL. В следующих таблицах истинности показано, как работают операторы AND, OR и NOT при наличии значения NULL. (T = true, F = false и U = неизвестно или NULL.)
Основные сведения о параметре ANSI_NULLS
System.Data.SqlTypes предоставляет ту же семантику, что и при установке параметра ANSI_NULLS в SQL Server. Все арифметические операторы (+, -, *, /, %), битовые операции (~, &, |) и большинство функций возвращают NULL, если какие-либо из операндов или аргументов равны NULL, за исключением операндов или аргументов для свойства IsNull .
Стандарт ANSI SQL-92 не поддерживает columnName = NULL в предложении WHERE. В SQL Server параметр ANSI_NULLS управляет допустимостью значений NULL по умолчанию в базе данных и вычислением сравнений со значениями NULL. Если параметр ANSI_NULLS включен (по умолчанию), то при проверке на наличие значений NULL в выражениях должен использоваться оператор IS NULL. Например, результатом следующего сравнения всегда является неизвестность при включенном параметре ANSI_NULLS:
colname > NULL
Сравнение с переменной, содержащей значение NULL, также приводит к неизвестному результату:
colname > @MyVariable
Для тестирования на значение NULL используются предикаты IS NULL и IS NOT NULL. Это может усложнить предложение WHERE. Например, столбец TerritoryID в таблице AdventureWorks Customer допускает значения NULL. Если инструкция SELECT используется для тестирования на значения NULL в дополнение к другим, она должна включать предикат IS NULL:
SELECT CustomerID, AccountNumber, TerritoryID FROM AdventureWorks.Sales.Customer WHERE TerritoryID IN (1, 2, 3) OR TerritoryID IS NULL
Если в SQL Server параметр ANSI_NULLS отключен, можно создать выражения, которые используют оператор равенства для сравнения со значением NULL. Однако нельзя запретить другим подключениям задавать параметры NULL для этого подключения. Использование параметра IS NULL для проверки на наличие значений NULL всегда работает, независимо от установленного значения ANSI_NULLS для подключения.
Установка ANSI_NULLS OFF не поддерживается в DataSet , который всегда соответствует стандарту ANSI SQL-92 для обработки значений NULL в System.Data.SqlTypes.
Присвоение значений NULL
Значения NULL являются специальными, и их семантика хранения и назначения различается в разных системах типов и системах хранения. Dataset предназначен для использования с различными системами типов и хранения.
В этом разделе описывается семантика значений NULL для присвоения значений NULL для DataColumn в DataRow в различных системах типов.
DBNull.Value
Это назначение допустимо для любого типа DataColumn . Если тип реализует INullable , DBNull.Value приводится к соответствующему строго типизированному значению NULL.
SqlType.Null
Все типы данных System.Data.SqlTypes реализуют INullable . Если строго типизированное значение NULL может быть преобразовано в тип данных столбца с помощью операторов неявного приведения, то назначение должно быть принятым. Иначе будет вызвано исключение недопустимого приведения.
null
Если значение NULL является допустимым для указанного типа данных DataColumn , оно приводится к соответствующему значению DbNull.Value или Null , связанному с типом INullable ( SqlType.Null ).
derivedUdt.Null
Для столбцов пользовательского типа значения NULL всегда хранятся в зависимости от типа, связанного с DataColumn . Рассмотрим случай пользовательского типа, связанного с DataColumn , который не реализует INullable в отличие от своего подкласса. В этом случае, если назначено строго типизированное значение NULL, связанное с производным классом, оно сохраняется как нетипизированное значение DbNull.Value , так как хранилище значений NULL всегда согласуется с типом данных DataColumn.
В настоящее время структура Nullable или Nullable не поддерживается в DataSet .
Назначение нескольких столбцов (строк)
DataTable.Add , DataTable.LoadDataRow или другие API-интерфейсы, принимающие массив ItemArray, который сопоставляется со строкой, сопоставляют значение NULL со значением по умолчанию DataColumn. Если объект в массиве содержит DbNull.Value или строго типизированный аналог, применяются те же правила, которые описаны выше.
Кроме того, следующие правила применяются к экземпляру назначений NULL DataRow.[«columnName»] :
- Используемое по умолчанию значение default является DbNull.Value для всех столбцов, за исключением строго типизированных нулевых столбцов с допустимыми строго типизированными значениями NULL.
- Значения NULL никогда не записываются во время сериализации в XML-файлы (как в xsi:nil).
- Все значения, в том числе по умолчанию, отличные от NULL, всегда записываются при сериализации в XML. Это отличается от семантики XSD/XML, где значение NULL (xsi: nil) является явным, а значение по умолчанию — неявным (если отсутствует в XML, то проверяющее средство синтаксического анализа может получить его из связанной схемы XSD). Обратное верно для DataTable : значение NULL является неявным, а значение по умолчанию — явным.
- Всем отсутствующим значениям столбцов для строк, считываемых из входных данных XML, присваивается значение NULL. Строкам, созданным с помощью NewRow или аналогичных методов, присваивается значение по умолчанию DataColumn.
- Метод IsNull возвращает true как для DbNull.Value , так и для INullable.Null .
Присвоение значений NULL для SqlTypes
Значение по умолчанию для любого экземпляра System.Data.SqlTypes— NULL.
Значения NULL в System.Data.SqlTypes относятся к определенному типу и не могут быть представлены одним значением, таким как DbNull . Чтобы проверить на наличие значений NULL, используйте свойство IsNull .
Значения NULL могут быть назначены DataColumn, как показано в следующем примере кода. Вы можете напрямую назначить значения NULL для переменных SqlTypes без запуска исключения.
Пример
В следующем примере кода показано создание DataTable с двумя столбцами, определенными как SqlInt32 и SqlString. Код добавляет одну строку известных значений, одну строку значений NULL, а затем выполняет итерацию по DataTable, присваивая значения переменным и отображая выходные данные в окне консоли.
using Microsoft.Data.SqlClient; using System.Data.SqlTypes; class Program < static void Main() < WorkWithSqlNulls(); Console.ReadLine(); >static private void WorkWithSqlNulls() < DataTable table = new DataTable(); // Specify the SqlType for each column. DataColumn idColumn = table.Columns.Add("ID", typeof(SqlInt32)); DataColumn descColumn = table.Columns.Add("Description", typeof(SqlString)); // Add some data. DataRow nRow = table.NewRow(); nRow["ID"] = 123; nRow["Description"] = "Side Mirror"; table.Rows.Add(nRow); // Add null values. nRow = table.NewRow(); nRow["ID"] = SqlInt32.Null; nRow["Description"] = SqlString.Null; table.Rows.Add(nRow); // Initialize variables to use when // extracting the data. SqlBoolean isColumnNull = false; SqlInt32 idValue = SqlInt32.Zero; SqlString descriptionValue = SqlString.Null; // Iterate through the DataTable and display the values. foreach (DataRow row in table.Rows) < // Assign values to variables. Note that you // do not have to test for null values. idValue = (SqlInt32)row["ID"]; descriptionValue = (SqlString)row["Description"]; // Test for null value in ID column. isColumnNull = idValue.IsNull; // Display variable values in console window. Console.Write("isColumnNull=, Description=", isColumnNull, idValue, descriptionValue); Console.WriteLine(); > > >
В этом примере отображаются следующие результаты:
isColumnNull=False, Description=Side Mirror isColumnNull=True, Description=Null
Сравнение значений NULL с SqlTypes и типами CLR
При сравнении значений NULL важно понимать разницу между тем, как метод Equals вычисляет значения NULL в System.Data.SqlTypes по сравнению с тем, как он работает с типами CLR. Все методы System.Data.SqlTypes Equals используют семантику базы данных для вычисления значений NULL. Если одно или оба значения являются NULL, результатом сравнения будет NULL. С другой стороны, при использовании метода Equals CLR для двух System.Data.SqlTypes вернется значение true, если оба значения соответствуют NULL. Это отражает разницу между использованием метода экземпляра, такого как метод String.Equals CLR, и использованием статического или общего метода SqlString.Equals .
В следующем примере показана разница результатов между методами SqlString.Equals и String.Equals , если каждому из них передается пара значений NULL, а затем пара пустых строк.
using System.Data.SqlTypes; namespace SqlNullsCS < class Program < static void Main() < CompareNulls(); Console.ReadLine(); >private static void CompareNulls() < // Create two new null strings. SqlString a = new SqlString(); SqlString b = new SqlString(); // Compare nulls using static/shared SqlString.Equals. Console.WriteLine("SqlString.Equals shared/static method:"); Console.WriteLine(" Two nulls=", SqlStringEquals(a, b)); // Compare nulls using instance method String.Equals. Console.WriteLine(); Console.WriteLine("String.Equals instance method:"); Console.WriteLine(" Two nulls=", StringEquals(a, b)); // Make them empty strings. a = ""; b = ""; // When comparing two empty strings (""), both the shared/static and // the instance Equals methods evaluate to true. Console.WriteLine(); Console.WriteLine("SqlString.Equals shared/static method:"); Console.WriteLine(" Two empty strings=", SqlStringEquals(a, b)); Console.WriteLine(); Console.WriteLine("String.Equals instance method:"); Console.WriteLine(" Two empty strings=", StringEquals(a, b)); > private static string SqlStringEquals(SqlString string1, SqlString string2) < // SqlString.Equals uses database semantics for evaluating nulls. string returnValue = SqlString.Equals(string1, string2).ToString(); return returnValue; >private static string StringEquals(SqlString string1, SqlString string2) < // String.Equals uses CLR type semantics for evaluating nulls. string returnValue = string1.Equals(string2).ToString(); return returnValue; >> >
Получается следующий вывод:
SqlString.Equals shared/static method: Two nulls=Null String.Equals instance method: Two nulls=True SqlString.Equals shared/static method: Two empty strings=True String.Equals instance method: Two empty strings=True
Дальнейшие действия
SQL-Ex blog

Логический (булев) тип данных отсутствует в SQL Server. Другие базы данных, подобные Oracle и MySQL, поддерживают логический тип данных, который принимает значения TRUE и FALSE.
SQL Server использует тип данных Bit, который принимает значения 0, 1 и NULL, которые могут использоваться вместо значений TRUE, FALSE и NULL. Здесь мы рассмотрим несколько примеров на вставку и выборку этих значений.
Что это за тип данных bit?
Этот тип данных может хранить 3 значения, 1, 0 и NULL. Этот тип данных более эффективен, чем тип данных Boolean, используемый другим СУБД, поскольку он использует только один бит для хранения данных. Давайте рассмотрим примеры его использования.
Примеры логического типа в SQL Server
Следующий пример создаст переменную с именем myBoolean типом данных bit. Затем мы установим для переменной значение true и посмотрим результаты.
declare @myBoolean bit
set @myBoolean='true'
select @myBoolean result

Заметьте, что когда мы выбираем это значение, то выводится 1, означающее true.
Аналогично вы можете установить булево значение в false.
declare @myBoolean bit
set @myBoolean='false'
select @myBoolean result

Наоборот, и как лучшая практика, вы можете присваивать числа этой переменной. Следующий пример присвоит переменной myBoolean значение 1, а не true. Это предпочтительный вариант.
declare @myBoolean bit
set @myBoolean=1
select @myBoolean result

Вместо значения false мы присваиваем значение 0.
declare @myBoolean bit
set @myBoolean=0
select @myBoolean result

Резюмируя сказанное, вы можете присваивать битовой переменной значения 0, 1 или использовать ‘TRUE’ и ‘FALSE’.
Наконец, вы можете установить переменную bit в значение NULL, если это необходимо. В следующем примере переменной @myBoolean присваивается значение NULL.
declare @myBoolean bit
set @myBoolean=NULL
select @myBoolean result

Как заменить значения 0, 1 на значения true или false
Как вы уже видели, тип bit показывает 0 и 1 вместо TRUE и FALSE. Как можно заменить значения 0 и 1 на TRUE и FALSE?
Следующий пример демонстрирует как это сделать. Мы будем использовать оператор CASE для замены значений. Вот этот пример.
declare @myBoolean bit
set @myBoolean='TRUE'
select
case
WHEN @myBoolean=1 then 'TRUE'
WHEN @myBoolean=0 then 'FALSE'
ELSE NULL
end as result

Код выполняет следующее. Если значение равно 1, то будет возвращаться TRUE. Если значение переменной равно 0, то возвращается FALSE. В противном случае возвращается NULL.
Как создать таблицу со столбцом типа данных bit
В следующем примере создается таблица с именем myBooleanTable и двумя столбцами. Столбец ID имеет тип INTEGER, а столбец ispair — тип данных BIT.
create table myBooleanTable
(
id int,
ispair bit
)
Как вставить данные логического типа
Для вставки данных типа bit вы можете использовать только значения 0, 1 и NULL. Например, ниже мы вставляем данные в ранее созданную таблицу myBooleanTable.
insert into myBooleanTable values
(1,0),
(2,1),
(5,NULL)
Работа с запросами SQL
Следующий пример использует учебную базу данных Adventureworks. Если она у вас не установлена, обратитесь к этой статье относительно ее установки и конфигурирования.
В этом примере мы будем использовать таблицу HumanResource.Employee, которая содержит несколько столбцов типа данных bit. В первом примере мы используем битовый столбец SalariedFlag.
Следующий пример выводит столбцы BusinessEntityID, NationalIDNumber и SalariedFlag, когда SalariedFlag равен 1.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag =1

Для получения аналогичной информации для сотрудников, у которых Salariedflag равен false, вы можете поменять значение флага SalariedFlag на false (0).
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag =0
И, наоборот, вы можете использовать значения TRUE и FALSE вместо 0 и 1, но это не рекомендуется.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag ='true'
Наконец, мы можем использовать значение NULL в предложении WHERE. Использование NULL несколько отличается от использования значений 0 и 1, поскольку вы должны применять оператор IS вместо равенства.
Следующий пример иллюстрирует это.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag IS NULL
Преобразование логических значений к другим типам данных
Следующий пример показывает результат сложения числового значения со значением типа bit. Мы объявляем переменную myBoolean, устанавливая ее значение в true, а затем прибавляем 2.
declare @myBoolean bit
set @myBoolean='true'
select @myBoolean+2 result

Итак, в этом примере myBoolean равен 1, а 1+2 равно 3, это означает, что битовое значение неявно преобразуется к числовому.
Если мы попытаемся выполнить конкатенацию (оператор +), то получим ошибку. Следующий пример иллюстрирует эту проблему.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+@myBoolean
Сообщение об ошибке гласит:
Типы данных varchar и bit несовместимы в операции сложения.
Лучшим решением этой проблемы является использование оператора CONCAT, который преобразует переменную bit к строке.
declare @myBoolean bit
set @myBoolean=1
select CONCAT ('The value is ',@myBoolean) as result
CONCAT конкатенирует строку с переменной bit, что даст следующий результат:

Как нерекомендуемый вариант, мы можем использовать функцию CONVERT для преобразования переменной bit в строку. Для данного сценария использование CONCAT является лучшим решением. Однако для других сценариев вы, возможно, не сможете использовать CONCAT, и потребуется использовать CONVERT вместо этого.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+CONVERT(varchar(1),@myBoolean) as result
Функция CONVERT преобразует тип данных bit переменной @myBoolean в varchar(1), которое уже может конкатенироваться со строкой.
Другим вариантом является использование CAST. CAST подобна CONVERT, мы включаем этот вариант только для того, что вы были знакомы с этим вариантом, который может вам встретиться где-то еще.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+CAST(@myBoolean as varchar(1)) as result
Синтаксис CAST несколько отличается от CONVERT. Вы должны указать выражение, а затем тип данных.
Хранимые процедуры с логическими переменными
Хранимые процедуры представляют собой код, который хранится в базе данных и который вы можете вызывать повторно и многократно использовать.
В этом примере мы покажем, как создать хранимую процедуру с переменными типа bit и выполнить её.
Сначала создадим хранимую процедуру с именем salariedFlag, которая выводит LoginID пользователей с salariedFlag, равным true (1) или false (0). В соответствии с переменной @salariedFlag выводиться будут значения, указанные в предложении WHERE. Значения будут извлекаться из таблицы Employee.
create procedure salariedFlag
(
@salariedFlag bit
)
as
select LoginID
from [HumanResources].[Employee]
where salariedFlag = @salariedFlag
Для выполнения хранимой процедуры используется предложение EXEC и указывается значение для переменной (параметра) @salariedFlag.
exec salariedFlag 1
Этот код выполняет salariedFlag, при этом @salaried получает значение 1 (TRUE).
Вот результат, возвращаемый хранимой процедурой:

Эти значения LoginID соответствуют SalariedFlag, равному TRUE. Если мы хотим увидеть LoginID, соответствующие значению FALSE (0), вы можете вызвать эту процедуру с другим значением параметра. Мы можем использовать EXECUTE вместо EXEC. Мы можем также включить в вызов имя параметра (что является лучшим вариантом использования, который легче понять и поддерживать, особенно в случае хранимых процедур с многими параметрами).
execute salariedFlag @salariedFlag='False'
Как видно в этом примере, мы используем команду EXECUTE, а не EXEC, и имя параметра @salariedFlag, в отличие от предыдущего примера. Наконец, мы используем значение, равное строке False, а не значению 0 (не рекомендуется, но работает).
Результат выполнения хранимой процедуры представлен ниже.
Какие типы данных не поддерживают null значения sql
Этот раздел описывает различные типы данных, доступные в СУБД Firebird и MS SQL, а также соответствия типов для перехода с одной системы на другую.
Доступные типы данных СУБД MS SQL зависят от версии СУБД. В следующей таблице перечислены типы данных и версия СУБД, в которой они были введены.
Таблица 1. Таблица соответствия типов данных
Определение MSSQL и пояснения
8-байтные целочисленные данные.
Двоичные данные фиксированной длины. Максимальная длина 8000 байт. В версии 6.5 максимальная длина была 255 байт.
Целочисленные данные со значениями только 1 или 0 . Обычно заменяются константами ‘T’ и ‘F’ . (В СУБД Firebird так же можно использовать тип SMALLINT со значениями 0 и 1 . — прим. перев.)
Текстовые данные фиксированной длины (не-Unicode). Максимальная длина 8000 символов. В версии 6.5 максимальная длина была 255 байт. СУБД Firebird способна хранить до 32767 символов.
Ссылка на курсор. Этот тип используется только в хранимых процедурах и триггерах; этот тип не может использоваться при объявлении структуры таблиц.
Дата и время с 1 января 1753 года до 31 декабря 9999 года, точность 3/100 секунды (3.33 мс).
Числовые данные с фиксированной точностью. Диапазон от -10 38 -1 до 10 38 -1.
Вещественные числовые данные. Диапазон от -1.79E+38 до 1.79E+38.
Двоичные данные переменной длины. Максимальная длина 2 31 -1 (2147483647) байт.
4-байтные целочисленные данные. Диапазон от -2 31 (-2147483648) до 2 31 -1 (2147483647).
Денежные данные. Диапазон от -2 63 (-922337203685477.5808) до 2 63 -1 (+922337203685477.5807), точность до 1/10000 денежной единицы.
CHAR(x) CHARACTER SET UNICODE_FSS
Символные данные фиксированной длины (Unicode). Максимальная длина 4000 символов.
BLOB SUB_TYPE TEXT
Символьные данные переменной длины (Unicode). Максимальная длина 2 30 -1 (1073741823) символов.
В СУБД MS SQL decimal и numeric эквивалентны.
VARCHAR(x) CHARACTER SET UNICODE_FSS
Символьные данные переменной длины. Максимальная длина 4000 символов.
Вещественные данные. Диапазон от -3.40E+308 до 3.40E+308.
Дата и время с 1 января 1900 года до 6 июня 2079 года, точность 1 минута. Тип данных Firebird имеет бОльшие диапазон и точность.
2-байтные целочисленные данные. Диапазон от -2 15 (-32768) до 2 15 -1 (32767).
Денежные данные. Диапазон от -214748.3648 до +214748.3647, точность 1/10000 денежной единицы. Диапазон СУБД Firebird больше при указанной замене.
Данные различных типов.
Промежуточные результаты выполнения запроса для последующего использования.
BLOB SUB_TYPE TEXT
Символьные данные переменной длины (не-Unicode). Максимальная длина 2 31 -1 (2147483647) символов.
INTEGER или BIGINT
Уникальное для базы данных число. В СУБД Firebird Вам необходимо использовать механизм генераторов для этих целей.
1-байтовое целочисленное значение без знака. Диапазон от 0 до 255. В СУБД Firebird нет эквивалентного типа.
Двоичные данные переменной длины. Максимальная длина 8000 байт.
Символьные данные переменной длины (не-Unicode). Максимальная длина 8000 символов. СУБД Firebird способна хранить до 32765 символов. В СУБД MS SQL 6.5 максимум был 255 символов.
Глобально уникальный идентификатор (GUID). В СУБД Firebird Вам неоходимо использовать функции, определяемые пользователем (UDF), для генерации значения идентификатора. (Если Вы собираетесь индексировать поле с глобально уникальными идентификаторами, то лучше использовать UUID — это другой формат представления GUID, представляемый как CHAR(22). — прим. перев.)
Небольшое различие в поведении в СУБД Firebird между типами NUMERIC и DECIMAL , которое приходит на ум, заключается в том, что определение NUMERIC означает четко указанную точность (общее число цифр), в то время как DECIMAL одначает как минимум указанную точность. В СУБД MS SQL оба типа numeric и decimal эквивалентны.
Существует также квази-тип данных — identity (идентификатор), который может использоваться только для указания в определениях таблиц. Фактически, это тип данных int , значение поля автоматически генерируется при добавлении новой записи и не может быть впоследствии изменено.
Перенос типа данных bit
Тип данных bit используется для хранения булевого (логического) значения, 0 или 1 . СУБД MS SQL не поддерживает присваивание значения NULL таким полям. Пользователи СУБД Firebird могут эмулировать поведение логического типа, используя типы SMALLINT или CHAR(1) .
Возможные значения полей логического типа в СУБД Firebird могут быть ограничены через использование доменов (domains).
Перенос типа данных identity (идентификатор)
Существует несколько способов переноса механизма идентификаторов СУБД MS SQL. В общем, СУБД Firebird имеет бОльшую гибкость и мощь в этом вопросе.
Самый простой способ создаия аналога типа identity — создание триггера BEFORE INSERT (перед вставкой новой записи в базу данных) для интересующей Вас таблицы, и в этом триггере присваивать очередное значение генератора. Такой метод гарантирует уникальность (при условии, что шаг для генератора отличен от нуля и всегда имеет один и то же знак — прим. перев.).
Для дополнительной гибкости, можно использовать один генератор для всех таблиц. В этом случае получится аналог типа timestamp — уникального для всей базы данных идентификатора.
Еще одна обычная техника — создание хранимой процедуры, которая возвращает очередное значение генератора. Это так же позволяет получать значение генератора и использовать его для нескольких операций (например, при добавлении записи в основную таблицу, а затем добавлении нескольких записей в подчиненную таблицу).
CREATE TABLE my_table ( my_number integer not null primary key )
CREATE GENERATOR my_generator
CREATE TRIGGER my_before_trigger FOR my_table BEFORE INSERT AS BEGIN IF (NEW.my_number IS NULL) THEN NEW.my_number = GEN_ID(my_generator, 1); END
CREATE PROCEDURE get_my_generator RETURNS (new_value INTEGER) AS BEGIN new_value = GEN_ID(my_generator, 1); END
Перенос типа данных uniqueidentifier (глобально уникальный идентификатор)
В СУБД MS SQL тип uniqueidentifier используется для репликации. Также это простой способ определения уникальных глобальных идентификаторов для записей базы данных.
Для использования аналогичного типа данных в СУБД Firebird создайте триггер BEFORE INSERT (перед вставкой новой записи) для интересующей Вас таблицы с полем типа uniqueidentifier , и используйте значение функции, определяемой пользователем (UDF), для получения очередного значения GUID.
Вы можете использовать библиотеку uuidUDF (прим. перев.):
/************************************************************** UUID_CREATE Returns a UUID (cstring(22), compressed, reversed, URL compatible UUID) Parameters: cstring(22) dummy to allow Interbase to perform memory management Returns: cstring(22) **************************************************************/ DECLARE EXTERNAL FUNCTION UUID_CREATE CSTRING(22) RETURNS PARAMETER 1 ENTRY_POINT 'fn_uuid_create' MODULE_NAME 'uuidlib'; /************************************************************** GUID_CREATE Returns a GUID (cstring(36), standard readable representation of a UUID in the xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format) Parameters: cstring(36) dummy to allow Interbase to perform memory management Returns: cstring(36) **************************************************************/ DECLARE EXTERNAL FUNCTION GUID_CREATE CSTRING(36) RETURNS PARAMETER 1 ENTRY_POINT 'fn_guid_create' MODULE_NAME 'uuidlib';
| Firebird Documentation Index → Переход с MS SQL на Firebird → Типы данных |