Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database w Microsoft Fabric
Tworzy nową tabelę w bazie danych.
Uwaga / Notatka
Aby uzyskać informacje na temat magazynu w usłudze Microsoft Fabric, odwiedź stronę CREATE TABLE (Fabric Data Warehouse). Aby uzyskać informacje na temat usługi Azure Synapse Analytics and Analytics Platform System (PDW), odwiedź stronę CREATE TABLE (Azure Synapse Analytics).
Transact-SQL konwencje składni
Opcje składni
Wspólna składnia
Prosta składnia CREATE TABLE (typowa, jeśli nie używa opcji):
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition> } [ ,... n ] )
[ ; ]
Pełna składnia
Składnia CREATE TABLE oparta na dysku:
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
[ AS FileTable ]
( { <column_definition>
| <computed_column_definition>
| <column_set_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ] }
[ ,... n ]
[ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
, system_end_time_column_name ) ]
)
[ ON { partition_scheme_name ( partition_column_name )
| filegroup
| "default" } ]
[ TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name
| filegroup
| "default" } ]
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ MASKED WITH ( FUNCTION = 'mask_function' ) ]
[ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
[ IDENTITY [ ( seed , increment ) ] ]
[ NOT FOR REPLICATION ]
[ GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] ]
[ [ CONSTRAINT constraint_name ] {NULL | NOT NULL} ]
[ ROWGUIDCOL ]
[ ENCRYPTED WITH
( COLUMN_ENCRYPTION_KEY = key_name ,
ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
) ]
[ <column_constraint> [ ,... n ] ]
[ <column_index> ]
<data_type> ::=
[ type_schema_name. ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ ( <column_name> [ ,... n ] ) ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<column_index> ::=
INDEX index_name [ CLUSTERED | NONCLUSTERED ]
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ ,... n ] )
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column_name [ ,... n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<table_index> ::=
{
{
INDEX index_name [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ ,... n ] )
| INDEX index_name CLUSTERED COLUMNSTORE [ ORDER (column_name [ , ...n ] ) ]
| INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
}
[ INCLUDE ( column_name [ ,... n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}
<table_option> ::=
{
[ DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ] ]
[ XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ] ]
[ FILETABLE_DIRECTORY = <directory_name> ]
[ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
[ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
[ SYSTEM_VERSIONING = ON
[ ( HISTORY_TABLE = schema_name.history_table_name
[ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]
) ]
]
[ REMOTE_DATA_ARCHIVE =
{
ON [ ( <table_stretch_options> [ ,... n] ) ]
| OFF ( MIGRATION_STATE = PAUSED )
}
]
[ DATA_DELETION = ON
{ (
FILTER_COLUMN = column_name,
RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS } }
) }
]
[ LEDGER = ON [ ( <ledger_option> [ ,... n ] ) ]
| OFF
]
}
<ledger_option>::=
{
[ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ] ]
[ APPEND_ONLY = ON | OFF ]
}
<ledger_view_option>::=
{
[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
}
<table_stretch_options> ::=
{
[ FILTER_PREDICATE = { NULL | table_predicate_function } , ]
MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | <range> }
[ ,... n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Składnia tabel zoptymalizowanych pod kątem pamięci
Składnia CREATE TABLE zoptymalizowana pod kątem pamięci:
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ]
[ ,... n ] }
[ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
, system_end_time_column_name ) ]
)
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
[ NULL | NOT NULL ]
[ [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
| [ IDENTITY [ ( 1, 1 ) ] ]
[ <column_constraint> ]
[ <column_index> ]
<data_type> ::=
[type_schema_name. ] type_name [ (precision [ , scale ]) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{ NONCLUSTERED
| NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
}
[ ( <column_name> [ ,... n ] ) ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
| CHECK ( logical_expression )
}
<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{
NONCLUSTERED ( column_name [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column_name [ ,... n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
| CHECK ( logical_expression )
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH ( BUCKET_COUNT = bucket_count ) }
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
| [ NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [ Minutes ] } ) ]
[ ON filegroup_name | default ]
}
<table_option> ::=
{
MEMORY_OPTIMIZED = ON
| DURABILITY = { SCHEMA_ONLY | SCHEMA_AND_DATA }
| SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}
Argumenty (w programowaniu)
database_name
Nazwa bazy danych, w której jest tworzona tabela. database_name musi określić nazwę istniejącej bazy danych. Jeśli nie zostanie określony, database_name domyślne dla bieżącej bazy danych. Identyfikator logowania dla bieżącego połączenia musi być skojarzony z istniejącym identyfikatorem użytkownika w bazie danych określonej przez database_name, a identyfikator użytkownika musi mieć uprawnienia CREATE TABLE.
schema_name
Nazwa schematu, do którego należy nowa tabela.
table_name
Nazwa nowej tabeli. Nazwy tabel muszą być zgodne z regułami dotyczącymi identyfikatorów .
table_name może zawierać maksymalnie 128 znaków, z wyjątkiem lokalnych nazw tabel tymczasowych (nazw poprzedzonych znakiem pojedynczego numeru (#
)), które nie mogą przekraczać 116 znaków.
AS FileTable
Dotyczy: SQL Server 2012 (11.x) i nowsze.
Tworzy nową tabelę jako tabelę FileTable. Nie określasz kolumn, ponieważ tabela FileTable ma stały schemat. Aby uzyskać więcej informacji, zobacz FileTables (Tabele plików).
column_nameAS computed_column_expression
Wyrażenie definiujące wartość obliczonej kolumny. Obliczona kolumna to kolumna wirtualna, która nie jest fizycznie przechowywana w tabeli, chyba że kolumna jest oznaczona jako UTRWALONE. Kolumna jest obliczana na podstawie wyrażenia, które używa innych kolumn w tej samej tabeli. Na przykład kolumna obliczeniowa może mieć definicję: cost AS price * qty
. Wyrażenie może być niekompilowaną nazwą kolumny, stałą, funkcją, zmienną i dowolną kombinacją tych połączonych przez co najmniej jeden operator. Wyrażenie nie może być podzapytaniem ani nie może zawierać typów danych aliasu.
Kolumny obliczane mogą być używane na listach wybranych, klauzul WHERE, klauzul ORDER BY lub innych lokalizacjach, w których można używać wyrażeń regularnych, z następującymi wyjątkami:
Obliczone kolumny muszą być oznaczone jako UTRWALONE, aby uczestniczyć w ograniczeniu KLUCZ OBCY lub CHECK.
Obliczona kolumna może być używana jako kolumna klucza w indeksie lub jako część dowolnego klucza podstawowego lub ograniczenia UNIKATOWEGO, jeśli obliczona wartość kolumny jest definiowana przez wyrażenie deterministyczne, a typ danych wyniku jest dozwolony w kolumnach indeksu.
Jeśli na przykład tabela zawiera kolumny
a
całkowite ib
kolumnę obliczeniową może być indeksowanaa + b
, ale obliczona kolumnaa + DATEPART(dd, GETDATE())
nie może zostać zindeksowana, ponieważ wartość może ulec zmianie w kolejnych wywołaniach.Obliczona kolumna nie może być celem instrukcji INSERT lub UPDATE.
Uwaga / Notatka
Każdy wiersz w tabeli może mieć różne wartości dla kolumn, które są zaangażowane w obliczoną kolumnę; dlatego obliczona kolumna może nie mieć tej samej wartości dla każdego wiersza.
Na podstawie wyrażeń, które są używane, wartość null obliczonych kolumn jest określana automatycznie przez aparat bazy danych. Wynik większości wyrażeń jest uznawany za dopuszczalny do wartości null, nawet jeśli istnieją tylko kolumny nienaliwalne, ponieważ możliwe podpełnienia lub przepełnienia również generują wyniki NULL.
COLUMNPROPERTY
Użyj funkcji z właściwością AllowsNull, aby zbadać wartość null dowolnej obliczonej kolumny w tabeli. Wyrażenie, które jest dopuszczające wartość null, można przekształcić w nienależący do wartości, określając ISNULL
zmienną check_expression , gdzie stała jest wartością nonnull podstawioną dla dowolnego wyniku NULL. Uprawnienie REFERENCES dla typu jest wymagane dla kolumn obliczeniowych opartych na wyrażeniach typu zdefiniowanych przez użytkownika środowiska uruchomieniowego języka wspólnego (CLR).
UTRWALONE
Określa, że aparat bazy danych programu SQL Server będzie fizycznie przechowywać obliczone wartości w tabeli i aktualizować wartości, gdy są aktualizowane inne kolumny, od których zależy obliczona kolumna. Oznaczanie obliczonej kolumny jako PERSISTED
umożliwia utworzenie indeksu w obliczonej kolumnie, która jest deterministyczna, ale nie dokładna. Aby uzyskać więcej informacji, zobacz Indeksy w kolumnach obliczanych. Wszystkie obliczone kolumny, które są używane jako partycjonowanie kolumn tabeli partycjonowanej, muszą być jawnie oznaczone .PERSISTED
computed_column_expression musi być deterministyczny, gdy PERSISTED
jest określony.
ON { partition_scheme | filegroup | "default" }
Określa schemat partycji lub grupę plików, na której jest przechowywana tabela. Jeśli partition_scheme jest określona, tabela ma być tabelą partycjonowaną, której partycje są przechowywane w zestawie co najmniej jednej grupy plików określonej w partition_scheme. Jeśli zostanie określona grupa plików , tabela jest przechowywana w nazwie filegroup. Grupa plików musi istnieć w bazie danych. Jeśli "default"
wartość jest określona lub w ogóle nie zostanie określona, tabela jest przechowywana w domyślnej grupie plików. Mechanizm przechowywania tabeli określony w artykule CREATE TABLE nie może zostać później zmieniony.
ON { partition_scheme | filegroup | "default" } można również określić w kluczu PODSTAWOWYM lub unikatowym ograniczeniu. Te ograniczenia tworzą indeksy. Jeśli określono grupę plików , indeks jest przechowywany w nazwanej grupie plików. Jeśli "default"
parametr jest określony lub w ogóle nie zostanie określony, indeks jest przechowywany w tej samej grupie plików co tabela. Jeśli klucz podstawowy lub ograniczenie UNIQUE tworzy indeks klastrowany, strony danych dla tabeli są przechowywane w tej samej grupie plików co indeks. Jeśli CLUSTERED
określono lub ograniczenie w przeciwnym razie tworzy indeks klastrowany, a partition_scheme określono, że różni się od partition_scheme lub grupy plików definicji tabeli lub odwrotnie, tylko definicja ograniczenia zostanie honorowana, a druga zostanie zignorowana.
Uwaga / Notatka
W tym kontekście wartość domyślna nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w ON "default"
lub ON [default]
. Jeśli "default"
jest określona QUOTED_IDENTIFIER
, opcja musi być włączona dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
Po utworzeniu tabeli podzielonej na partycje rozważ ustawienie LOCK_ESCALATION
opcji dla tabeli na AUTO
. Może to poprawić współbieżność, włączając blokady w celu eskalacji do poziomu partycji (HoBT) zamiast tabeli. Aby uzyskać więcej informacji, zobacz ALTER TABLE.
TEXTIMAGE_ON { filegroup | "default" }
Wskazuje, że kolumny typu text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max)i CLR zdefiniowane przez użytkownika kolumny typu (w tym geometria i geografia) są przechowywane w określonej grupie plików.
TEXTIMAGE_ON
parametr nie jest dozwolony, jeśli w tabeli nie ma żadnych dużych kolumn wartości.
TEXTIMAGE_ON
Nie można określić, jeśli określono partition_scheme . Jeśli "default"
zostanie określona wartość lub jeśli TEXTIMAGE_ON
w ogóle nie zostanie określona, kolumny o dużej wartości są przechowywane w domyślnej grupie plików. Nie można później zmienić magazynu danych kolumny o dużej wartości określonej w elem CREATE TABLE
.
Uwaga / Notatka
varchar(max), nvarchar(max), varbinary(max), xml i duże wartości UDT są przechowywane bezpośrednio w wierszu danych, maksymalnie do limitu 8000 bajtów i tak długo, jak wartość może pasować do rekordu. Jeśli wartość nie pasuje do rekordu, wskaźnik jest przechowywany w wierszu, a reszta jest przechowywana poza wierszem w przestrzeni magazynu LOB. 0 to wartość domyślna, która wskazuje, że wszystkie wartości są przechowywane bezpośrednio w wierszu danych.
TEXTIMAGE_ON
zmienia tylko lokalizację "miejsca do magazynowania LOB", ale nie ma to wpływu, gdy dane są przechowywane w wierszu. Użyj opcji dużych wartości poza wierszem sp_tableoption
, aby przechowywać całą wartość LOB poza wierszem.
W tym kontekście wartość domyślna nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w TEXTIMAGE_ON "default"
lub TEXTIMAGE_ON [default]
. Jeśli "default"
jest określona QUOTED_IDENTIFIER
, opcja musi być włączona dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
FILESTREAM_ON { partition_scheme_name | filegroup | "default" }
Dotyczy: SQL Server 2008 R2 (10.50.x) i nowsze. Usługi Azure SQL Database i Azure SQL Managed Instance nie obsługują FILESTREAM
usługi .
Określa grupę plików dla danych FILESTREAM.
Jeśli tabela zawiera dane FILESTREAM, a tabela jest partycjonowana, należy dołączyć klauzulę FILESTREAM_ON i określić schemat partycji grup plików FILESTREAM. Ten schemat partycji musi używać tej samej funkcji partycji i kolumn partycji co schemat partycji dla tabeli; w przeciwnym razie zostanie zgłoszony błąd.
Jeśli tabela nie jest partycjonowana, kolumna FILESTREAM nie może być partycjonowana. Dane FILESTREAM dla tabeli muszą być przechowywane w jednej grupie plików. Ta grupa plików jest określona w klauzuli FILESTREAM_ON.
Jeśli tabela nie jest partycjonowana i FILESTREAM_ON
klauzula nie jest określona, używana jest grupa plików FILESTREAM zawierająca DEFAULT
zestaw właściwości. Jeśli nie ma grupy plików FILESTREAM, zostanie zgłoszony błąd.
Podobnie jak w przypadku opcji WŁ. i TEXTIMAGE_ON
, nie można zmienić wartości ustawionej za pomocą polecenia CREATE TABLE
, FILESTREAM_ON
z wyjątkiem następujących przypadków:
- Instrukcja CREATE INDEX konwertuje stertę na indeks klastrowany. W tym przypadku można określić inną grupę plików FILESTREAM, schemat partycji lub wartość NULL.
- Instrukcja DROP INDEX konwertuje indeks klastrowany na stertę. W tym przypadku można określić inną grupę plików FILESTREAM, schemat partycji lub
"default"
.
Grupa plików w klauzuli FILESTREAM_ON <filegroup>
lub każda grupa plików FILESTREAM o nazwie w schemacie partycji musi mieć jeden plik zdefiniowany dla grupy plików. Ten plik musi być zdefiniowany przy użyciu instrukcji CREATE DATABASE lub ALTER DATABASE ; w przeciwnym razie zostanie zgłoszony błąd.
Aby zapoznać się z powiązanymi artykułami FILESTREAM, zobacz Binary Large Object — Blob Data (Dane obiektów blob binarnych).
[ type_schema_name. ] type_name
Określa typ danych kolumny i schemat, do którego należy. W przypadku tabel opartych na dyskach użyj jednego z następujących typów danych:
- Typ danych systemowych
- Typ aliasu oparty na typie danych systemowych programu SQL Server. Typy danych aliasu są tworzone za pomocą instrukcji
CREATE TYPE
, zanim będą mogły być używane w definicji tabeli. Przypisania wartości NULL lub NOT NULL dla typu danych aliasu można zastąpić podczas instrukcjiCREATE TABLE
. Nie można jednak zmienić specyfikacji długości; długość typu danych aliasu nie może być określona w instrukcjiCREATE TABLE
. - Typ zdefiniowany przez użytkownika środowiska CLR. Typy zdefiniowane przez użytkownika środowiska CLR są tworzone za pomocą instrukcji
CREATE TYPE
, zanim będą mogły być używane w definicji tabeli. Aby utworzyć kolumnę typu zdefiniowanego przez użytkownika CLR, uprawnienie REFERENCES jest wymagane w typie.
Jeśli nie określono type_schema_name , aparat bazy danych programu SQL Server odwołuje się type_name w następującej kolejności:
- Typ danych systemowych programu SQL Server.
- Domyślny schemat bieżącego użytkownika w bieżącej bazie danych.
- Schemat
dbo
w bieżącej bazie danych.
Aby zapoznać się z tabelami zoptymalizowanymi pod kątem pamięci, zobacz Obsługiwane typy danych dla In-Memory OLTP , aby uzyskać listę obsługiwanych typów systemów.
precyzji
Precyzja określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości dokładności, zobacz precyzji, skalowania i długości.
skalowanie
Skala dla określonego typu danych. Aby uzyskać więcej informacji na temat prawidłowych wartości skalowania, zobacz precyzji, skalowania i długości.
Max
Dotyczy tylko typów danych varchar, nvarchar i varbinary do przechowywania 2^31 bajtów znaków i danych binarnych oraz 2^30 bajtów danych Unicode.
ZAWARTOŚĆ
Określa, że każde wystąpienie typu danych XML w column_name może zawierać wiele elementów najwyższego poziomu. ZAWARTOŚĆ ma zastosowanie tylko do typu danych XML i można określić tylko wtedy, gdy określono również xml_schema_collection . Jeśli nie zostanie określony, zawartość jest zachowaniem domyślnym.
DOKUMENT
Określa, że każde wystąpienie typu danych XML w column_name może zawierać tylko jeden element najwyższego poziomu. DOKUMENT ma zastosowanie tylko do typu danych XML i można go określić tylko wtedy, gdy określono również xml_schema_collection .
xml_schema_collection
Dotyczy tylko typu danych XML w celu skojarzenia kolekcji schematów XML z typem. Przed wpisaniem kolumny XML do schematu należy najpierw utworzyć schemat w bazie danych przy użyciu funkcji CREATE XML SCHEMA COLLECTION.
DOMYŚLNY
Określa wartość podaną dla kolumny, gdy wartość nie jest jawnie podana podczas wstawiania. Definicje DOMYŚLNE można stosować do dowolnych kolumn z wyjątkiem tych zdefiniowanych jako znacznik czasu lub tych z właściwością IDENTITY
. Jeśli dla kolumny typu zdefiniowanego przez użytkownika określono wartość domyślną, typ powinien obsługiwać niejawną konwersję z constant_expression do typu zdefiniowanego przez użytkownika. Definicje DOMYŚLNE są usuwane, gdy tabela zostanie porzucona. Tylko stała wartość, taka jak ciąg znaków; funkcja skalarna (funkcja systemowa, zdefiniowana przez użytkownika lub CLR); wartość null może być używana jako wartość domyślna. Aby zachować zgodność z wcześniejszymi wersjami programu SQL Server, do domyślnej nazwy ograniczenia można przypisać nazwę ograniczenia.
constant_expression
Stała, NULL lub funkcja systemowa, która jest używana jako wartość domyślna dla kolumny.
memory_optimized_constant_expression
Stała, NULL lub funkcja systemowa obsługiwana jako wartość domyślna kolumny. Musi być obsługiwana w natywnie skompilowanych procedurach składowanych. Aby uzyskać więcej informacji na temat wbudowanych funkcji w natywnie skompilowanych procedurach składowanych, zobacz Obsługiwane funkcje dla natywnie skompilowanych modułów języka T-SQL.
TOŻSAMOŚĆ
Wskazuje, że nowa kolumna jest kolumną tożsamości. Po dodaniu nowego wiersza do tabeli aparat bazy danych udostępnia unikatową, przyrostową wartość dla kolumny. Kolumny tożsamości są zwykle używane z ograniczeniami KLUCZA PODSTAWOWEgo, aby służyć jako unikatowy identyfikator wiersza dla tabeli. Właściwość IDENTITY
można przypisać do kolumn tinyint, smallint, int, bigint, decimal(p, 0)lub numerycznych(p, 0). Dla tabeli można utworzyć tylko jedną kolumnę tożsamości. Nie można używać powiązanych wartości domyślnych i ograniczeń DOMYŚLNYch z kolumną tożsamości. Zarówno nasion, jak i inkrementacji lub nie należy ich określać. Jeśli żadna z nich nie zostanie określona, wartość domyślna to (1,1).
nasienie
Wartość użyta dla pierwszego wiersza załadowanego do tabeli.
wzrost
Wartość przyrostowa dodana do wartości tożsamości poprzedniego wiersza.
NIE DOTYCZY REPLIKACJI
W instrukcji CREATE TABLE
klauzulę NOT FOR REPLICATION
można określić dla właściwości IDENTITY, ograniczeń KLUCZA OBCEgo i CHECK. Jeśli ta klauzula IDENTITY
jest określona dla właściwości, wartości nie są zwiększane w kolumnach tożsamości, gdy agenci replikacji wykonują operacje wstawiania. Jeśli ta klauzula jest określona dla ograniczenia, ograniczenie nie jest wymuszane, gdy agenci replikacji wykonują operacje wstawiania, aktualizowania ani usuwania.
GENEROWANE ZAWSZE JAKO { WIERSZ | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ UKRYTE ] [ NOT NULL ]
Dotyczy: SQL Server 2016 (13.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Określa kolumnę używaną przez system do automatycznego rejestrowania informacji o wersjach wierszy w tabeli i jej tabeli historii (jeśli tabela ma wersję systemową i ma tabelę historii). Użyj tego argumentu z parametrem , WITH SYSTEM_VERSIONING = ON
aby utworzyć tabele o wersji systemowej: tabele czasowe lub rejestrowe. Aby uzyskać więcej informacji, zobacz tabele rejestru z możliwością aktualizacji i tabele czasowe.
Parametr | Wymagany typ danych | Wymagana wartość null | Opis |
---|---|---|---|
RZĄD | data/godzina2 | POCZĄTEK: NOT NULL KONIEC: NOT NULL |
Godzina rozpoczęcia, dla której wersja wiersza jest prawidłowa (START) lub godzina zakończenia, dla której wersja wiersza jest prawidłowa (END). Użyj tego argumentu z argumentem PERIOD FOR SYSTEM_TIME , aby utworzyć tabelę czasową. |
TRANSACTION_ID | bigint | POCZĄTEK: NOT NULL KONIEC: NULL |
Dotyczy: SQL Server 2022 (16.x) i nowsze oraz Azure SQL Database. Identyfikator transakcji, która tworzy (START) lub unieważnia (END) wersję wiersza. Jeśli tabela jest tabelą rejestru, identyfikator odwołuje się do wiersza w widoku sys.database_ledger_transactions |
SEQUENCE_NUMBER | bigint | POCZĄTEK: NOT NULL KONIEC: NULL |
Dotyczy: SQL Server 2022 (16.x) i nowsze oraz Azure SQL Database. Numer sekwencji operacji, która tworzy (START) lub usuwa (END) wersję wiersza. Ta wartość jest unikatowa w ramach transakcji. |
Jeśli spróbujesz określić kolumnę, która nie spełnia powyższych wymagań dotyczących typu danych lub wartości null, system zgłosi błąd. Jeśli nie określisz jawnie wartości null, system zdefiniuje kolumnę jako NULL
lub NOT NULL
zgodnie z powyższymi wymaganiami.
Możesz oznaczyć jedną lub obie kolumny kropką z flagą HIDDEN
, aby niejawnie ukryć te kolumny, tak aby SELECT * FROM <table>
nie zwracały wartości dla tych kolumn. Domyślnie kolumny kropki nie są ukryte. Aby można było używać, ukryte kolumny muszą być jawnie uwzględnione we wszystkich zapytaniach, które bezpośrednio odwołują się do tabeli czasowej. Aby zmienić HIDDEN
atrybut dla istniejącej kolumny okresu, PERIOD
należy usunąć i ponownie utworzyć z inną flagą ukrytą.
INDEX_NAME INDEKSU [ KLASTROWANE | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
Dotyczy: SQL Server 2014 (12.x) i nowsze oraz Azure SQL Database.
Określa, aby utworzyć indeks w tabeli. Może to być indeks klastrowany lub indeks nieklastrowany. Indeks będzie zawierać kolumny wymienione i posortuje dane w kolejności rosnącej lub malejącej.
INDEKS INDEX_NAME KLASTROWANY MAGAZYN KOLUMN
Dotyczy: SQL Server 2014 (12.x) i nowsze oraz Azure SQL Database.
Określa, aby przechowywać całą tabelę w formacie kolumnowym z klastrowanym indeksem magazynu kolumn. Zawsze obejmuje to wszystkie kolumny w tabeli. Dane nie są sortowane w kolejności alfabetycznej ani liczbowej, ponieważ wiersze są zorganizowane w celu uzyskania korzyści kompresji magazynu kolumn.
Możesz określić kolejność danych w klastrowanym indeksie magazynu kolumn, począwszy od programu SQL Server 2022 (16.x), w usłudze Azure SQL Database, w usłudze Azure SQL Managed InstanceAUTD i w usłudze Azure Synapse Analytics. Aby uzyskać więcej informacji, zobacz Optymalizacja wydajności z uporządkowanymi indeksami kolumnowymi.
INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,...n ] )
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.
Określa, aby utworzyć nieklastrowany indeks magazynu kolumn w tabeli. Tabela bazowa może być stertą magazynu wierszy lub indeksem klastrowanym lub może być klastrowanym indeksem magazynu kolumn. We wszystkich przypadkach utworzenie indeksu magazynu kolumn nieklastrowanego w tabeli przechowuje drugą kopię danych dla kolumn w indeksie.
Nieklastrowany indeks magazynu kolumn jest przechowywany i zarządzany jako indeks klastrowanego magazynu kolumn. Jest on nazywany indeksem nieklastrowanym magazynu kolumn, ponieważ kolumny mogą być ograniczone i istnieje jako indeks pomocniczy w tabeli.
Możesz określić kolejność danych w indeksie magazynu kolumn nieklastrowanego w usłudze Azure SQL Database i w usłudze Azure SQL Managed InstanceAUTD. Aby uzyskać więcej informacji, zobacz Optymalizacja wydajności z uporządkowanymi indeksami kolumnowymi.
ON partition_scheme_name ( column_name )
Określa schemat partycji, który definiuje grupy plików, na które będą mapowane partycje indeksu partycjonowanego. Schemat partycji musi istnieć w bazie danych, wykonując CREATE PARTITION SCHEME lub ALTER PARTITION SCHEME. column_name określa kolumnę, dla której zostanie podzielony indeks partycjonowany. Ta kolumna musi być zgodna z typem danych, długością i dokładnością argumentu funkcji partycji, która partition_scheme_name używa. column_name nie jest ograniczona do kolumn w definicji indeksu. Każdą kolumnę w tabeli podstawowej można określić, z wyjątkiem partycjonowania indeksu UNIQUE, column_name należy wybrać spośród tych, które są używane jako unikatowy klucz. To ograniczenie umożliwia aparatowi bazy danych weryfikowanie unikatowości wartości kluczy tylko w ramach jednej partycji.
Uwaga / Notatka
Podczas partycjonowania indeksu klastrowanego bez unikatowości aparat bazy danych domyślnie dodaje kolumnę partycjonowania do listy kluczy indeksu klastrowanego, jeśli nie została jeszcze określona. Podczas partycjonowania indeksu innego niż unikatowy, nieklastrowany aparat bazy danych dodaje kolumnę partycjonowania jako kolumnę inną niż klucz (dołączona) indeksu, jeśli nie została jeszcze określona.
Jeśli partition_scheme_name lub grupa plików nie zostanie określona, a tabela zostanie podzielona na partycje, indeks zostanie umieszczony w tym samym schemacie partycji, używając tej samej kolumny partycjonowania, co tabela bazowa.
Uwaga / Notatka
Nie można określić schematu partycjonowania w indeksie XML. Jeśli tabela podstawowa jest partycjonowana, indeks XML używa tego samego schematu partycji co tabela.
Aby uzyskać więcej informacji na temat partycjonowania indeksów, partycjonowane tabele i indeksy.
ON filegroup_name
Tworzy określony indeks w określonej grupie plików. Jeśli nie określono żadnej lokalizacji, a tabela lub widok nie są partycjonowane, indeks używa tej samej grupy plików co podstawowa tabela lub widok. Grupa plików musi już istnieć.
W POZYCJI "default"
Tworzy określony indeks w domyślnej grupie plików.
Uwaga / Notatka
W tym kontekście wartość domyślna nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w ON "default"
lub ON [default]
. Jeśli "default"
jest określona QUOTED_IDENTIFIER
, opcja musi być włączona dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER.
[ FILESTREAM_ON { filestream_filegroup_name partition_scheme_name | | "NULL" } ]
Dotyczy: SQL Server 2008 R2 (10.50.x) i nowsze.
Określa umieszczanie danych FILESTREAM dla tabeli podczas tworzenia klastrowanego indeksu. Klauzula FILESTREAM_ON umożliwia przenoszenie danych FILESTREAM do innej grupy plików FILESTREAM lub schematu partycji.
filestream_filegroup_name jest nazwą grupy plików FILESTREAM. Grupa plików musi mieć jeden plik zdefiniowany dla grupy plików przy użyciu instrukcji CREATE DATABASE lub ALTER DATABASE; w przeciwnym razie zostanie zgłoszony błąd.
Jeśli tabela jest podzielona na partycje, klauzula FILESTREAM_ON
musi być dołączona i musi określać schemat partycji grup plików FILESTREAM, które używają tej samej funkcji partycji i kolumn partycji co schemat partycji dla tabeli. W przeciwnym razie zostanie zgłoszony błąd.
Jeśli tabela nie jest partycjonowana, kolumna FILESTREAM nie może być partycjonowana. Dane FILESTREAM dla tabeli muszą być przechowywane w jednej grupie plików określonej w klauzuli FILESTREAM_ON
.
FILESTREAM_ON NULL
można określić w instrukcji CREATE INDEX
, jeśli tworzony jest indeks klastrowany, a tabela nie zawiera kolumny FILESTREAM.
Aby uzyskać więcej informacji, zobacz FILESTREAM.
ROWGUIDCOL
Wskazuje, że nowa kolumna jest kolumną GUID wiersza. Jako kolumnę ROWGUIDCOL można wyznaczyć tylko jedną unikatową kolumnę na tabelę. Zastosowanie właściwości ROWGUIDCOL umożliwia przywołowanie kolumny przy użyciu polecenia $ROWGUID
. Właściwość ROWGUIDCOL można przypisać tylko do kolumny uniqueidentifier . Nie można wyznaczyć kolumn typu danych zdefiniowanych przez użytkownika za pomocą funkcji ROWGUIDCOL.
Właściwość ROWGUIDCOL nie wymusza unikatowości wartości przechowywanych w kolumnie. Funkcja ROWGUIDCOL nie generuje również automatycznie wartości dla nowych wierszy wstawionych do tabeli. Aby wygenerować unikatowe wartości dla każdej kolumny, użyj funkcji NEWID lub NEWSEQUENTIALID w instrukcjach INSERT lub użyj tych funkcji jako domyślnej dla kolumny.
ZASZYFROWANE PRZY UŻYCIU
Określa szyfrowanie kolumn przy użyciu funkcji Always Encrypted .
COLUMN_ENCRYPTION_KEY = key_name
Określa klucz szyfrowania kolumny. Aby uzyskać więcej informacji, zobacz CREATE COLUMN ENCRYPTION KEY (TWORZENIE KLUCZA SZYFROWANIA KOLUMN).
ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED }
Szyfrowanie deterministyczne używa metody, która zawsze generuje tę samą zaszyfrowaną wartość dla dowolnej wartości zwykłego tekstu. Użycie szyfrowania deterministycznego umożliwia wyszukiwanie przy użyciu porównywania równości, grupowania i łączenia tabel przy użyciu sprzężeń równości opartych na zaszyfrowanych wartościach, ale może również umożliwić nieautoryzowanym użytkownikom odgadnięcie informacji o zaszyfrowanych wartościach, sprawdzając wzorce w zaszyfrowanej kolumnie. Łączenie dwóch tabel w kolumnach zaszyfrowanych deterministycznie jest możliwe tylko wtedy, gdy obie kolumny są szyfrowane przy użyciu tego samego klucza szyfrowania kolumny. Szyfrowanie deterministyczne musi używać sortowania kolumn z binarnym2 kolejnością sortowania dla kolumn znaków.
szyfrowania losowego używa metody, która szyfruje dane w mniej przewidywalny sposób. Szyfrowanie losowe jest bezpieczniejsze, ale uniemożliwia wszelkie obliczenia i indeksowanie w zaszyfrowanych kolumnach, chyba że wystąpienie programu SQL Server obsługuje funkcję Always Encrypted z bezpiecznymi enklawami. Aby uzyskać szczegółowe informacje, zobacz Always Encrypted z bezpiecznymi enklawami.
Jeśli używasz funkcji Always Encrypted (bez bezpiecznych enklaw), użyj szyfrowania deterministycznego dla kolumn, które będą wyszukiwane przy użyciu parametrów lub parametrów grupowania, na przykład numeru identyfikatora rządu. Użyj szyfrowania losowego, aby uzyskać dane, takie jak numer karty kredytowej, który nie jest grupowany z innymi rekordami lub używany do łączenia tabel, i które nie są wyszukiwane, ponieważ używasz innych kolumn (takich jak numer transakcji), aby znaleźć wiersz zawierający zaszyfrowaną kolumnę zainteresowania.
Jeśli używasz funkcji Always Encrypted z bezpiecznymi enklawami, randomizowane szyfrowanie jest zalecanym typem szyfrowania.
Kolumny muszą być kwalifikowanym typem danych.
ALGORYTM
Dotyczy: SQL Server 2016 (13.x) i nowszych.
Musi mieć wartość
'AEAD_AES_256_CBC_HMAC_SHA_256'
.Aby uzyskać więcej informacji, w tym ograniczenia funkcji, zobacz Always Encrypted.
RZADKI
Wskazuje, że kolumna jest rozrzedliwą kolumną. Przechowywanie rozrzedzonych kolumn jest zoptymalizowane pod kątem wartości null. Nie można wyznaczyć kolumn rozrzednych jako NOT NULL. Aby uzyskać dodatkowe ograniczenia i więcej informacji o rozrzednych kolumnach, zobacz Use Sparse Columns.
MASKOWANE ZA POMOCĄ ( FUNKCJA = 'mask_function' )
Dotyczy: SQL Server 2016 (13.x) i nowszych.
Określa dynamiczną maskę danych. mask_function jest nazwą funkcji maskowania z odpowiednimi parametrami. Dostępne są cztery funkcje:
default()
email()
partial()
random()
Wymaga ALTER ANY MASK
uprawnienia.
Aby uzyskać informacje o parametrach funkcji, zobacz dynamiczne maskowanie danych.
FILESTREAM
Dotyczy: SQL Server 2008 R2 (10.50.x) i nowsze.
Prawidłowe tylko dla kolumn varbinary(max). Określa magazyn FILESTREAM dla danych varbinary(max) BLOB.
Tabela musi również mieć kolumnę unikatowego typu danychidentifier , który ma atrybut ROWGUIDCOL. Ta kolumna nie może zezwalać na wartości null i musi mieć ograniczenie UNIKATOWE lub KLUCZ PODSTAWOWY z jedną kolumną. Wartość identyfikatora GUID dla kolumny musi być podana przez aplikację podczas wstawiania danych lub przez ograniczenie DOMYŚLNE używające funkcji NEWID ().
Nie można porzucić kolumny ROWGUIDCOL i nie można zmienić powiązanych ograniczeń, gdy istnieje kolumna FILESTREAM zdefiniowana dla tabeli. Kolumna ROWGUIDCOL może zostać porzucona dopiero po usunięciu ostatniej kolumny FILESTREAM.
Gdy atrybut magazynu FILESTREAM jest określony dla kolumny, wszystkie wartości dla tej kolumny są przechowywane w kontenerze danych FILESTREAM w systemie plików.
SORTOWANIE collation_name
Określa sortowanie dla kolumny. Nazwa sortowania może być nazwą sortowania systemu Windows lub nazwą sortowania SQL. collation_name dotyczy tylko kolumn typu danych char, varchar, text, nchar, nvarchar i ntext . Jeśli nie zostanie określona, kolumna zostanie przypisana do sortowania typu danych zdefiniowanego przez użytkownika, jeśli kolumna ma typ danych zdefiniowany przez użytkownika lub domyślne sortowanie bazy danych.
Aby uzyskać więcej informacji na temat nazw sortowania systemu Windows i sql, zobacz Nazwa sortowania systemu Windows i Nazwa sortowania SQL.
Aby uzyskać więcej informacji, zobacz COLLATE.
OGRANICZENIE
Opcjonalne słowo kluczowe wskazujące początek definicji KLUCZA PODSTAWOWEgo, A NIE NULL, UNIKATOWEGO, OBCEGO LUB OGRANICZENIA CHECK.
constraint_name
Nazwa ograniczenia. Nazwy ograniczeń muszą być unikatowe w schemacie, do którego należy tabela.
NULL | NIE NULL
Ustal, czy wartości null są dozwolone w kolumnie. Wartość NULL nie jest ściśle ograniczeniem, ale może być określona tak jak NOT NULL. Nie można określić wartości NULL dla obliczonych kolumn tylko wtedy, gdy określono również wartość PERSISTED.
KLUCZ PODSTAWOWY
Ograniczenie wymuszające integralność jednostki dla określonej kolumny lub kolumn za pośrednictwem unikatowego indeksu. Dla tabeli można utworzyć tylko jedno ograniczenie klucza podstawowego.
NIEPOWTARZALNY
Ograniczenie zapewniające integralność jednostki dla określonej kolumny lub kolumn za pośrednictwem unikatowego indeksu. Tabela może mieć wiele unikatowych ograniczeń.
KLASTROWANE | NIEKLASTROWANE
Wskazuje, że indeks klastrowany lub nieklastrowany jest tworzony dla klucza PODSTAWOWEgo lub unikatowego ograniczenia. Domyślne ograniczenia KLUCZA PODSTAWOWEgo to CLUSTERED i UNIKATOWE ograniczenia domyślne DLA WARTOŚCI NONCLUSTERED.
W instrukcji
CREATE TABLE
CLUSTERED można określić tylko dla jednego ograniczenia. Jeśli parametr CLUSTERED jest określony dla ograniczenia UNIKATOWEGO, a ograniczenie KLUCZA PODSTAWOWEgo jest również określone, wartość domyślna KLUCZA PODSTAWOWEgo to NONCLUSTERED.ODWOŁANIA DO KLUCZY OBCYCH
Ograniczenie zapewniające integralność referencyjną danych w kolumnie lub kolumnach. Ograniczenia klucza obcego wymagają, aby każda wartość w kolumnie istniała w odpowiedniej, przywoływanych kolumnach lub kolumnach w tabeli, do których odwołuje się odwołanie. Ograniczenia KLUCZA OBCEgo mogą odwoływać się tylko do kolumn, które są kluczem PODSTAWOWYM lub unikatowymi ograniczeniami w tabeli lub kolumnach, do których odwołuje się odwołanie w indeksie UNIKATOWYm w tabeli, do których odwołuje się odwołanie. Klucze obce w kolumnach obliczeniowych muszą być również oznaczone jako UTRWALONE.
[ [ schema_name. ] referenced_table_name ]
Nazwa tabeli, do której odwołuje się ograniczenie KLUCZA OBCEgo, oraz schemat, do którego należy.
( ref_column [ ,... n ] )
Kolumna lub lista kolumn z tabeli, do których odwołuje się ograniczenie KLUCZ OBCY.
PO USUNIĘCIU { BRAK AKCJI | CASCADE | USTAW WARTOŚĆ NULL | USTAW WARTOŚĆ DOMYŚLNĄ }
Określa, jaka akcja ma miejsce w wierszach w utworzonej tabeli, jeśli te wiersze mają relację referencyjną, a przywoływany wiersz zostanie usunięty z tabeli nadrzędnej. Wartość domyślna to BRAK AKCJI.
BRAK AKCJI
Aparat bazy danych zgłasza błąd i akcja usuwania w wierszu w tabeli nadrzędnej jest cofana.
KASKADA
Odpowiednie wiersze są usuwane z tabeli odwołującej się, jeśli ten wiersz zostanie usunięty z tabeli nadrzędnej.
USTAW WARTOŚĆ NULL
Wszystkie wartości tworzące klucz obcy są ustawione na wartość NULL, jeśli odpowiedni wiersz w tabeli nadrzędnej zostanie usunięty. Aby to ograniczenie było wykonywane, kolumny klucza obcego muszą mieć wartość null.
USTAW WARTOŚĆ DOMYŚLNĄ
Wszystkie wartości tworzące klucz obcy są ustawione na wartości domyślne po usunięciu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, wszystkie kolumny klucza obcego muszą mieć definicje domyślne. Jeśli kolumna jest dopuszczana do wartości null i nie ma jawnego zestawu wartości domyślnych, wartość NULL staje się niejawną wartością domyślną kolumny.
Nie określaj
CASCADE
, czy tabela zostanie uwzględniona w publikacji scalanej korzystającej z rekordów logicznych. Aby uzyskać więcej informacji na temat rekordów logicznych, zobacz Grupowanie zmian w powiązanych wierszach z rekordami logicznymi.ON DELETE CASCADE
Nie można zdefiniować, jeśliINSTEAD OF
wyzwalaczON DELETE
już istnieje w tabeli.Na przykład w
AdventureWorks2022
bazie danychProductVendor
tabela ma relację odwołania z tabeląVendor
. KluczProductVendor.BusinessEntityID
obcy odwołuje się do klucza podstawowegoVendor.BusinessEntityID
.DELETE
Jeśli instrukcja jest wykonywana w wierszu wVendor
tabeli, aON DELETE CASCADE
akcja jest określona dlaProductVendor.BusinessEntityID
, aparat bazy danych sprawdza co najmniej jeden wiersz zależny wProductVendor
tabeli. Jeśli istnieje, wiersze zależne wProductVendor
tabeli zostaną usunięte, a także wiersz, do któregoVendor
odwołuje się tabela.Z drugiej strony, jeśli
NO ACTION
jest określony, aparat bazy danych zgłasza błąd i cofa akcjęVendor
usuwania w wierszu, jeśli wProductVendor
tabeli znajduje się co najmniej jeden wiersz odwołujący się do niego.PODCZAS AKTUALIZACJI { BRAK AKCJI | CASCADE | USTAW WARTOŚĆ NULL | USTAW WARTOŚĆ DOMYŚLNĄ }
Określa, jaka akcja dzieje się z wierszami w tabeli zmienionymi, gdy te wiersze mają relację referencyjną, a przywoływane wiersze są aktualizowane w tabeli nadrzędnej. Wartość domyślna to BRAK AKCJI.
BRAK AKCJI
Aparat bazy danych zgłasza błąd, a akcja aktualizacji w wierszu w tabeli nadrzędnej jest cofana.
KASKADA
Odpowiednie wiersze są aktualizowane w tabeli odwołującej się po zaktualizowaniu tego wiersza w tabeli nadrzędnej.
USTAW WARTOŚĆ NULL
Wszystkie wartości tworzące klucz obcy są ustawione na wartość NULL po zaktualizowaniu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, kolumny klucza obcego muszą mieć wartość null.
USTAW WARTOŚĆ DOMYŚLNĄ
Wszystkie wartości tworzące klucz obcy są ustawione na wartości domyślne po zaktualizowaniu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, wszystkie kolumny klucza obcego muszą mieć definicje domyślne. Jeśli kolumna jest dopuszczana do wartości null i nie ma jawnego zestawu wartości domyślnych, wartość NULL staje się niejawną wartością domyślną kolumny.
Nie określaj
CASCADE
, czy tabela zostanie uwzględniona w publikacji scalanej korzystającej z rekordów logicznych. Aby uzyskać więcej informacji na temat rekordów logicznych, zobacz Grupowanie zmian w powiązanych wierszach z rekordami logicznymi.ON UPDATE CASCADE
,SET NULL
lubSET DEFAULT
nie można zdefiniować, jeśliINSTEAD OF
wyzwalaczON UPDATE
już istnieje w tabeli, która jest zmieniana.Na przykład w bazie danych
AdventureWorks2022
tabela ma relację referencyjną zProductVendor
tabelą:Vendor
klucz obcy odwołuje się do klucza podstawowegoProductVendor.BusinessEntity
.Vendor.BusinessEntityID
Jeśli instrukcja UPDATE jest wykonywana w wierszu w
Vendor
tabeli, a dla akcji CASCADE AKTUALIZACJI JEST określonaProductVendor.BusinessEntityID
wartość , aparat bazy danych sprawdza, czy w tabeli znajduje się co najmniej jeden wiersz zależnyProductVendor
. Jeśli istnieją, wiersze zależne wProductVendor
tabeli są aktualizowane, a także wiersz, do któregoVendor
odwołuje się tabela.Z drugiej strony, jeśli nie określono żadnej akcji, aparat bazy danych zgłasza błąd i cofa akcję
Vendor
aktualizacji w wierszu, jeśli wProductVendor
tabeli znajduje się co najmniej jeden wiersz odwołujący się do niego.SPRAWDZIĆ
Ograniczenie wymuszające integralność domeny przez ograniczenie możliwych wartości, które można wprowadzić w kolumnie lub kolumnach. Ograniczenia CHECK dla obliczonych kolumn muszą być również oznaczone jako UTRWALONE.
logical_expression
Wyrażenie logiczne zwracające wartość TRUE lub FALSE. Typy danych aliasu nie mogą być częścią wyrażenia.
column_name
Kolumna lub lista kolumn w nawiasach używana w ograniczeniach tabeli w celu wskazania kolumn używanych w definicji ograniczenia.
[ ASC | DESC ]
Określa kolejność sortowania kolumn lub kolumn uczestniczących w ograniczeniach tabeli. Wartość domyślna to ASC.
partition_scheme_name
Nazwa schematu partycji definiującego grupy plików, na których będą mapowane partycje tabeli partycjonowanej. Schemat partycji musi istnieć w bazie danych.
[ partition_column_name. ]
Określa kolumnę, dla której zostanie podzielona tabela partycjonowana. Kolumna musi być zgodna z wartością określoną w funkcji partycji, która partition_scheme_name jest używana pod względem typu danych, długości i dokładności. Obliczona kolumna, która uczestniczy w funkcji partycji, musi być jawnie oznaczona jako UTRWALONE.
Ważne
Zalecamy określenie wartości NOT NULL w kolumnie partycjonowania tabel partycjonowanych, a także tabel innych niż partycjonowane, które są źródłami lub obiektami docelowymi alter TABLE... Operacje SWITCH. W ten sposób upewnij się, że wszystkie ograniczenia CHECK dotyczące kolumn partycjonowania nie muszą sprawdzać wartości null.
WITH FILLFACTOR = fillfactor
Określa, jak pełny aparat bazy danych powinien utworzyć każdą stronę indeksu używaną do przechowywania danych indeksu. Wartości fillfactor określone przez użytkownika mogą należeć do zakresu od 1 do 100. Jeśli wartość nie jest określona, wartość domyślna to 0. Wartości współczynnika wypełnienia 0 i 100 są takie same we wszystkich aspektach.
Ważne
Dokumentowanie WITH FILLFACTOR = fillfactor jako jedyna opcja indeksu, która ma zastosowanie do klucza PODSTAWOWEgo lub unikatowych ograniczeń jest utrzymywana w celu zapewnienia zgodności z poprzednimi wersjami, ale nie zostanie udokumentowana w ten sposób w przyszłych wersjach.
COLUMN_SET XML column_set_name FOR ALL_SPARSE_COLUMNS
Nazwa zestawu kolumn. Zestaw kolumn to nietypowa reprezentacja XML, która łączy wszystkie rozrzedzone kolumny tabeli w dane wyjściowe ze strukturą. Aby uzyskać więcej informacji na temat zestawów kolumn, zobacz Use Column Sets.
OKRES DLA SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
Określa nazwy kolumn, których system będzie używać do rejestrowania okresu, dla którego rekord jest prawidłowy. Użyj tego argumentu GENERATED ALWAYS AS ROW { START | END }
z argumentami i WITH SYSTEM_VERSIONING = ON
, aby utworzyć tabelę czasową. Aby uzyskać więcej informacji, zobacz Tabele czasowe.
COMPRESSION_DELAY
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
W przypadku zoptymalizowanej pod kątem pamięci opóźnienie określa minimalną liczbę minut, przez które wiersz musi pozostać w tabeli bez zmian, zanim będzie kwalifikować się do kompresji do indeksu magazynu kolumn. Program SQL Server wybiera określone wiersze do skompresowania zgodnie z ich ostatnim czasem aktualizacji. Jeśli na przykład wiersze zmieniają się często w ciągu dwóch godzin, możesz ustawić, COMPRESSION_DELAY = 120 Minutes
aby upewnić się, że aktualizacje zostaną ukończone przed skompresowanie wiersza przez program SQL Server.
W przypadku tabeli opartej na dysku opóźnienie określa minimalną liczbę minut, przez które grupa wierszy różnicowych w stanie ZAMKNIĘTY musi pozostać w grupie wierszy różnicowych, zanim program SQL Server będzie mógł skompresować go do skompresowanej grupy wierszy. Ponieważ tabele oparte na dyskach nie śledzą czasów wstawiania i aktualizowania poszczególnych wierszy, program SQL Server stosuje opóźnienie do grup wierszy różnicowych w stanie CLOSED.
Wartość domyślna to 0 minut.
Aby uzyskać zalecenia dotyczące tego, kiedy używać usługi COMPRESSION_DELAY
, zobacz Wprowadzenie do magazynu kolumn na potrzeby analizy operacyjnej w czasie rzeczywistym
< > table_option ::=
Określa co najmniej jedną opcję tabeli.
Kompresja danych
Określa opcję kompresji danych dla określonej tabeli, numeru partycji lub zakresu partycji. Opcje są następujące:
ŻADEN
Tabele lub określone partycje nie są kompresowane.
RZĄD
Tabele lub określone partycje są kompresowane przy użyciu kompresji wierszy.
STRONA
Tabele lub określone partycje są kompresowane przy użyciu kompresji strony.
MAGAZYN KOLUMN
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
Dotyczy tylko indeksów magazynu kolumn, w tym zarówno nieklastrowanych magazynów kolumn, jak i klastrowanych indeksów magazynu kolumn. FUNKCJA COLUMNSTORE określa kompresję z najbardziej wydajną kompresją magazynu kolumn. Jest to typowy wybór.
COLUMNSTORE_ARCHIVE
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
Dotyczy tylko indeksów magazynu kolumn, w tym zarówno nieklastrowanych magazynów kolumn, jak i klastrowanych indeksów magazynu kolumn. COLUMNSTORE_ARCHIVE dodatkowo skompresować tabelę lub partycję do mniejszego rozmiaru. Może to być używane do archiwizacji lub w innych sytuacjach, które wymagają mniejszego rozmiaru magazynu i mogą pozwolić na więcej czasu na przechowywanie i pobieranie.
Aby uzyskać więcej informacji, zobacz Kompresja danych.
XML_COMPRESSION
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.
Określa opcję kompresji XML dla wszystkich kolumn typu danych xml xml w tabeli. Opcje są następujące:
NA
Kolumny używające xml typu danych są kompresowane.
Wyłączone
Kolumny używające typu danych xml nie są kompresowane.
NA PARTYCJACH ( { <partition_number_expression> | [ ,... n ] )
Określa partycje, do których mają zastosowanie ustawienia DATA_COMPRESSION
lub XML_COMPRESSION
. Jeśli tabela nie jest partycjonowana, ON PARTITIONS
argument wygeneruje błąd. Jeśli klauzula ON PARTITIONS
nie zostanie podana, DATA_COMPRESSION
opcja zostanie zastosowana do wszystkich partycji tabeli partycjonowanej.
partition_number_expression można określić w następujący sposób:
- Podaj numer partycji partycji, na przykład:
ON PARTITIONS (2)
- Podaj numery partycji dla kilku pojedynczych partycji rozdzielonych przecinkami, na przykład:
ON PARTITIONS (1, 5)
- Podaj zarówno zakresy, jak i poszczególne partycje, na przykład:
ON PARTITIONS (2, 4, 6 TO 8)
<range>
można określić jako numery partycji rozdzielone wyrazem TO, na przykład: ON PARTITIONS (6 TO 8)
.
Aby ustawić różne typy kompresji danych dla różnych partycji, określ opcję DATA_COMPRESSION
więcej niż raz, na przykład:
WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);
Można również określić opcję XML_COMPRESSION
więcej niż raz, na przykład:
WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);
< > index_option ::=
Określa co najmniej jedną opcję indeksu. Pełny opis tych opcji można znaleźć w temacie CREATE INDEX (TWORZENIE INDEKSu).
PAD_INDEX = { ON | WYŁ. }
Po włączeniu procent wolnego miejsca określonego przez FILLFACTOR jest stosowany do stron na poziomie pośrednim indeksu. Jeśli wartość OFF lub FILLFACTOR nie została określona, strony poziomu pośredniego są wypełniane w pobliżu pojemności pozostawiając wystarczającą ilość miejsca dla co najmniej jednego wiersza maksymalnego rozmiaru indeksu, biorąc pod uwagę zestaw kluczy na stronach pośrednich. Wartość domyślna to WYŁĄCZONE.
FILLFACTOR = fillfactor
Określa wartość procentową wskazującą, jak pełny aparat bazy danych powinien ustawić poziom liścia każdej strony indeksu podczas tworzenia lub modyfikowania indeksu. fillfactor musi być wartością całkowitą z zakresu od 1 do 100. Wartość domyślna to 0. Wartości współczynnika wypełnienia 0 i 100 są takie same we wszystkich aspektach.
IGNORE_DUP_KEY = { ON | WYŁ. }
Określa odpowiedź na błąd, gdy operacja wstawiania próbuje wstawić zduplikowane wartości klucza do unikatowego indeksu. Opcja IGNORE_DUP_KEY dotyczy tylko operacji wstawiania po utworzeniu lub odbudowaniu indeksu. Opcja nie ma wpływu podczas wykonywania CREATE INDEX, ALTER INDEXlub UPDATE. Wartość domyślna to WYŁĄCZONE.
NA
Po wstawieniu zduplikowanych wartości klucza do unikatowego indeksu zostanie wyświetlony komunikat ostrzegawczy. Tylko wiersze naruszające ograniczenie unikatowości zakończy się niepowodzeniem.
Wyłączone
Po wstawieniu zduplikowanych wartości klucza do unikatowego indeksu zostanie wyświetlony komunikat o błędzie. Cała operacja INSERT zostanie wycofana.
IGNORE_DUP_KEY
nie można ustawić wartości WŁĄCZONE dla indeksów utworzonych w widoku, indeksach innych niż unikatowe, indeksach XML, indeksach przestrzennych i filtrowanych indeksach.
Aby wyświetlić IGNORE_DUP_KEY
, użyj sys.indexes.
W składni zgodnej z poprzednimi wersjami WITH IGNORE_DUP_KEY
jest równoważna WITH IGNORE_DUP_KEY = ON
.
STATISTICS_NORECOMPUTE = { ON | WYŁ. }
W przypadku włączenia nieaktualne statystyki indeksu nie są automatycznie ponownie obliczane. Po wyłączeniu automatyczne aktualizowanie statystyk jest włączone. Wartość domyślna to WYŁĄCZONE.
ALLOW_ROW_LOCKS = { ON | WYŁ. }
Po włączeniu blokady wierszy są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat bazy danych określa, kiedy są używane blokady wierszy. W przypadku wyłączenia blokady wierszy nie są używane. Wartość domyślna to WŁĄCZONE.
ALLOW_PAGE_LOCKS = { ON | WYŁ. }
Po włączeniu blokady strony są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat bazy danych określa, kiedy są używane blokady strony. W przypadku wyłączenia blokady strony nie są używane. Wartość domyślna to WŁĄCZONE.
OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | WYŁ. }
Dotyczy: SQL Server 2019 (15.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Określa, czy należy zoptymalizować pod kątem rywalizacji o wstawienie ostatniej strony. Wartość domyślna to WYŁĄCZONE. Aby uzyskać więcej informacji, zobacz sekcję Sekwencyjne klucze na stronie CREATE INDEX.
FILETABLE_DIRECTORY = directory_name
Dotyczy: SQL Server 2012 (11.x) i nowsze.
Określa nazwę katalogu FileTable zgodną z systemem Windows. Ta nazwa powinna być unikatowa wśród wszystkich nazw katalogów FileTable w bazie danych. Porównanie unikatowości jest bez uwzględniania wielkości liter, niezależnie od ustawień sortowania. Jeśli ta wartość nie zostanie określona, zostanie użyta nazwa tabeli FileTable.
FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
Dotyczy: SQL Server 2012 (11.x) i nowsze. Usługi Azure SQL Database i Azure SQL Managed Instance nie obsługują FILETABLE
usługi .
Określa nazwę sortowania do zastosowania do Name
kolumny w tabeli FileTable. Sortowanie musi być bez uwzględniania wielkości liter, aby było zgodne z semantyka nazw plików systemu operacyjnego Windows. Jeśli ta wartość nie zostanie określona, zostanie użyte sortowanie domyślne bazy danych. Jeśli domyślne sortowanie bazy danych uwzględnia wielkość liter, zostanie zgłoszony błąd, a operacja CREATE TABLE zakończy się niepowodzeniem.
collation_name
Nazwa sortowania bez uwzględniania wielkości liter.
database_default
Określa, że należy użyć sortowania domyślnego dla bazy danych. Sortowanie musi być bez uwzględniania wielkości liter.
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
Dotyczy: SQL Server 2012 (11.x) i nowsze. Usługi Azure SQL Database i Azure SQL Managed Instance nie obsługują FILETABLE
usługi .
Określa nazwę, która ma być używana dla ograniczenia klucza podstawowego, które jest automatycznie tworzone w tabeli FileTable. Jeśli ta wartość nie jest określona, system generuje nazwę ograniczenia.
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name
Dotyczy: SQL Server 2012 (11.x) i nowsze. Usługi Azure SQL Database i Azure SQL Managed Instance nie obsługują FILETABLE
usługi .
Określa nazwę, która ma być używana dla unikatowego ograniczenia, które jest automatycznie tworzone w kolumnie stream_id w tabeli FileTable. Jeśli ta wartość nie jest określona, system generuje nazwę ograniczenia.
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name
Dotyczy: SQL Server 2012 (11.x) i nowsze. Usługi Azure SQL Database i Azure SQL Managed Instance nie obsługują FILETABLE
usługi .
Określa nazwę, która ma być używana dla unikatowego ograniczenia, które jest automatycznie tworzone w kolumnach parent_path_locator i name w tabeli FileTable. Jeśli ta wartość nie jest określona, system generuje nazwę ograniczenia.
SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
Dotyczy: SQL Server 2016 (13.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Włącza przechowywanie wersji systemu tabeli, jeśli są spełnione wymagania dotyczące typu danych, ograniczenia wartości null i ograniczenia klucza podstawowego. System będzie rejestrować historię każdego rekordu w tabeli z wersją systemową w oddzielnej tabeli historii. Jeśli argument HISTORY_TABLE
nie jest używany, nazwa tej tabeli historii będzie MSSQL_TemporalHistoryFor<primary_table_object_id>
. Jeśli nazwa tabeli historii jest określona podczas tworzenia tabeli historii, musisz określić schemat i nazwę tabeli.
Jeśli tabela historii nie istnieje, system generuje nową tabelę historii zgodną ze schematem bieżącej tabeli w tej samej grupie plików co bieżąca tabela, tworząc łącze między dwiema tabelami i umożliwia systemowi rejestrowanie historii każdego rekordu w bieżącej tabeli w tabeli historii. Domyślnie tabela historii jest kompresowana w formacie PAGE
.
HISTORY_TABLE
Jeśli argument jest używany do tworzenia łącza do istniejącej tabeli historii i używania jej, łącze jest tworzone między bieżącą tabelą a określoną tabelą. Jeśli bieżąca tabela jest partycjonowana, tabela historii jest tworzona w domyślnej grupie plików, ponieważ konfiguracja partycjonowania nie jest replikowana automatycznie z bieżącej tabeli do tabeli historii. Podczas tworzenia linku do istniejącej tabeli historii można wybrać przeprowadzenie sprawdzania spójności danych. Ten sprawdzanie spójności danych gwarantuje, że istniejące rekordy nie nakładają się na siebie. Sprawdzanie spójności danych jest wartością domyślną.
Użyj tego argumentu PERIOD FOR SYSTEM_TIME
z argumentami i GENERATED ALWAYS AS ROW { START | END }
, aby włączyć przechowywanie wersji systemu w tabeli. Aby uzyskać więcej informacji, zobacz Tabele czasowe. Użyj tego argumentu z argumentem , WITH LEDGER = ON
aby utworzyć tabelę rejestru z możliwością aktualizowania. Używanie istniejących tabel historii z tabelami rejestru nie jest dozwolone.
REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ) ] | OFF ( MIGRATION_STATE = WSTRZYMANO ) }
Dotyczy: SQL Server 2016 (13.x) i nowszych.
Tworzy nową tabelę z włączoną lub wyłączoną bazą danych Stretch. Aby uzyskać więcej informacji, zobacz Stretch Database.
Ważne
Baza danych Stretch jest przestarzała w programie SQL Server 2022 (16.x) i usłudze Azure SQL Database. W przyszłej wersji silnika bazy danych, ta funkcja zostanie usunięta. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.
włączanie bazy danych Stretch dla tabeli
Po włączeniu funkcji Stretch dla tabeli przez określenie ON
opcji można opcjonalnie określić MIGRATION_STATE = OUTBOUND
, aby natychmiast rozpocząć migrację danych lub MIGRATION_STATE = PAUSED
odroczyć migrację danych. Wartość domyślna to MIGRATION_STATE = OUTBOUND
. Aby uzyskać więcej informacji na temat włączania funkcji Stretch dla tabeli, zobacz Włączanie bazy danych Stretch dla tabeli.
Wymagania wstępne . Przed włączeniem programu Stretch dla tabeli należy włączyć usługę Stretch na serwerze i w bazie danych. Aby uzyskać więcej informacji, zobacz Włączanie bazy danych Stretch dla bazy danych.
Uprawnienia. Włączenie funkcji Stretch dla bazy danych lub tabeli wymaga db_owner uprawnień. Włączenie funkcji Stretch dla tabeli wymaga również uprawnień ALTER w tabeli.
[ FILTER_PREDICATE = { NULL | predykat } ]
Dotyczy: SQL Server 2016 (13.x) i nowszych.
Opcjonalnie określa predykat filtru, aby wybrać wiersze do migracji z tabeli zawierającej zarówno dane historyczne, jak i bieżące. Predykat musi wywołać deterministyczną funkcję wartości tabeli wbudowanej. Aby uzyskać więcej informacji, zobacz Enable Stretch Database for a table (Włączanie bazy danych Stretch dla tabeli ) i Select rows to migrate by using a filter function (Włączanie bazy danych Stretch dla tabeli) i Select rows to migrate by using a filter function (Wybieranie wierszy do migracji przy użyciu funkcji filtru).
Ważne
Jeśli podasz predykat filtru, który działa źle, migracja danych również działa źle. Baza danych Stretch stosuje predykat filtru do tabeli przy użyciu operatora CROSS APPLY.
Jeśli nie określisz predykatu filtru, cała tabela zostanie zmigrowana.
Po określeniu predykatu filtru należy również określić MIGRATION_STATE.
MIGRATION_STATE = { OUTBOUND | RUCH PRZYCHODZĄCY | WSTRZYMANO }
Dotyczy: SQL Server 2016 (13.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Określ
OUTBOUND
, aby przeprowadzić migrację danych z programu SQL Server do usługi Azure SQL Database.Określ
INBOUND
, aby skopiować dane zdalne dla tabeli z usługi Azure SQL Database z powrotem do programu SQL Server i wyłączyć funkcję Stretch dla tabeli. Aby uzyskać więcej informacji, zobacz Disable Stretch Database and bring back remote data.Ta operacja wiąże się z kosztami transferu danych i nie można jej anulować.
Określ
PAUSED
, aby wstrzymać lub odłożyć migrację danych. Aby uzyskać więcej informacji, zobacz Wstrzymywanie i wznawianie migracji danych -Stretch Database.
[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | LATA } ) } ]
Dotyczy: Tylko usługa Azure SQL Edge
Umożliwia czyszczenie starych lub przestarzałych danych z tabel w bazie danych na podstawie zasad przechowywania. Aby uzyskać więcej informacji, zobacz Włączanie i wyłączanie przechowywania danych. Aby można było włączyć przechowywanie danych, należy określić następujące parametry.
FILTER_COLUMN = { column_name }
Określa kolumnę, która ma być używana do określenia, czy wiersze w tabeli są przestarzałe, czy nie. Następujące typy danych są dozwolone dla kolumny filtru.
- daty
- data/godzina
- data/godzina2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITE | number {DAY | DNI | TYDZIEŃ | TYGODNIE | MIESIĄC | MIESIĄCE | ROK | LATA }}
Określa zasady okresu przechowywania dla tabeli. Okres przechowywania jest określany jako kombinacja dodatniej wartości całkowitej i jednostki części daty.
MEMORY_OPTIMIZED
Dotyczy: SQL Server 2014 (12.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance. Usługa Azure SQL Managed Instance nie obsługuje tabel zoptymalizowanych pod kątem pamięci w warstwie Ogólnego przeznaczenia.
Wartość ON wskazuje, że tabela jest zoptymalizowana pod kątem pamięci. Tabele zoptymalizowane pod kątem pamięci są częścią In-Memory funkcji OLTP, która służy do optymalizowania wydajności przetwarzania transakcji. Aby rozpocząć pracę z In-Memory OLTP, zobacz Szybki start 1: In-Memory OLTP Technologies for Faster Transact-SQL Performance (Szybki start 1: In-Memory TECHNOLOGIE OLTP w celu uzyskania szybszej wydajności Transact-SQL). Aby uzyskać bardziej szczegółowe informacje na temat tabel zoptymalizowanych pod kątem pamięci, zobacz Memory-Optimized Tabele.
Wartość domyślna OFF wskazuje, że tabela jest oparta na dysku.
CZAS ŻYCIA
Dotyczy: SQL Server 2014 (12.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Wartość SCHEMA_AND_DATA
wskazuje, że tabela jest trwała, co oznacza, że zmiany są utrwalane na dysku i przetrwać ponowne uruchomienie lub przejście w tryb failover. SCHEMA_AND_DATA jest wartością domyślną.
Wartość parametru SCHEMA_ONLY
wskazuje, że tabela jest nietrwała. Schemat tabeli jest utrwalany, ale żadne aktualizacje danych nie są utrwalane po ponownym uruchomieniu ani przejściu w tryb failover bazy danych.
DURABILITY = SCHEMA_ONLY
wartość jest dozwolona tylko w przypadku MEMORY_OPTIMIZED = ON
.
Ostrzeżenie
Po utworzeniu DURABILITY = SCHEMA_ONLY
tabeli za pomocą elementu , a READ_COMMITTED_SNAPSHOT
następnie zmianie zostanie zmieniona przy użyciu metody ALTER DATABASE
, dane w tabeli zostaną utracone.
BUCKET_COUNT
Dotyczy: SQL Server 2014 (12.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Wskazuje liczbę zasobników, które powinny zostać utworzone w indeksie skrótu. Maksymalna wartość dla BUCKET_COUNT w indeksach skrótów wynosi 1073 741 824. Aby uzyskać więcej informacji na temat liczby zasobników, zobacz Indeksy dla tabel Memory-Optimized.
Bucket_count jest argumentem wymaganym.
INDEKS
Dotyczy: SQL Server 2014 (12.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Indeksy kolumn i tabel można określić jako część instrukcji CREATE TABLE. Aby uzyskać szczegółowe informacje na temat dodawania i usuwania indeksów w tabelach zoptymalizowanych pod kątem pamięci, zobacz Zmienianie tabel Memory-Optimized
HASZ
Dotyczy: SQL Server 2014 (12.x) i nowsze, Azure SQL Database i Azure SQL Managed Instance.
Wskazuje, że tworzony jest indeks HASH.
Indeksy skrótów są obsługiwane tylko w tabelach zoptymalizowanych pod kątem pamięci.
LEDGER = ON ( <ledger_option> [ ,... n ] ) | OD
Dotyczy: SQL Server 2022 (16.x), Azure SQL Database i Azure SQL Managed Instance.
Uwaga / Notatka
Jeśli instrukcja tworzy tabelę rejestru, ENABLE LEDGER
wymagane jest uprawnienie.
Wskazuje, czy tworzona tabela jest tabelą rejestru (WŁ.), czy też nie (OFF). Wartość domyślna to WYŁĄCZONE. Jeśli zostanie określona APPEND_ONLY = ON
opcja, system tworzy tabelę rejestru tylko do dołączania zezwalającą tylko na wstawianie nowych wierszy. W przeciwnym razie system tworzy tabelę rejestru z możliwością aktualizacji. Tabela rejestru z możliwością aktualizowania wymaga również argumentu SYSTEM_VERSIONING = ON
. Tabela rejestru z możliwością aktualizowania musi być również tabelą z systemem. Jednak tabela rejestru z możliwością aktualizacji nie musi być tabelą czasową (nie wymaga parametru PERIOD FOR SYSTEM_TIME
). Jeśli tabela historii jest określona za pomocą LEDGER = ON
parametru i SYSTEM_VERSIONING = ON
, nie może odwoływać się do istniejącej tabeli.
Baza danych rejestru (baza danych utworzona za pomocą LEDGER = ON
opcji) zezwala tylko na tworzenie tabel rejestru. Próby utworzenia tabeli z elementem LEDGER = OFF
spowodują wystąpienie błędu. Każda nowa tabela jest domyślnie tworzona jako tabela rejestru z możliwością aktualizowania, nawet jeśli nie określisz LEDGER = ON
parametru i zostanie utworzona z wartościami domyślnymi dla wszystkich innych parametrów.
Tabela rejestru z możliwością aktualizowania musi zawierać cztery GENERATED ALWAYS
kolumny, dokładnie jedną kolumnę zdefiniowaną przy użyciu każdego z następujących argumentów:
GENERATED ALWAYS AS TRANSACTION_ID START
GENERATED ALWAYS AS TRANSACTION_ID END
GENERATED ALWAYS AS SEQUENCE_NUMBER START
GENERATED ALWAYS AS SEQUENCE_NUMBER END
Tabela rejestru tylko do dołączania musi zawierać dokładnie jedną kolumnę zdefiniowaną z każdym z następujących argumentów:
GENERATED ALWAYS AS TRANSACTION_ID START
GENERATED ALWAYS AS SEQUENCE_NUMBER START
Jeśli którakolwiek z wymaganych wygenerowanych kolumn zawsze nie jest zdefiniowana w CREATE TABLE
instrukcji , a instrukcja zawiera LEDGER = ON
, system automatycznie podejmie próbę dodania kolumny przy użyciu odpowiedniej definicji kolumny z poniższej listy. Jeśli występuje konflikt nazwy z już zdefiniowaną kolumną, system zgłosi błąd.
[ledger_start_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL
[ledger_end_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL
[ledger_start_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
[ledger_end_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL
<Ledger_view_option> określa schemat i nazwę widoku rejestru, który system automatycznie tworzy i łączy do tabeli. Jeśli opcja nie zostanie określona, system wygeneruje nazwę widoku rejestru, dołączając _Ledger
do nazwy tworzonej tabeli (database_name.schema_name.table_name
). Jeśli istnieje widok o określonej lub wygenerowanej nazwie, system zgłosi błąd. Jeśli tabela jest tabelą rejestru z możliwością aktualizowania, widok rejestru jest tworzony jako związek w tabeli i jej tabeli historii.
Każdy wiersz w widoku rejestru reprezentuje tworzenie lub usuwanie wersji wiersza w tabeli rejestru. Widok rejestru zawiera wszystkie kolumny tabeli rejestru, z wyjątkiem wygenerowanych zawsze kolumn wymienionych powyżej. Widok rejestru zawiera również następujące dodatkowe kolumny:
Nazwa kolumny | Typ danych | Opis |
---|---|---|
Określono przy TRANSACTION_ID_COLUMN_NAME użyciu opcji .
ledger_transaction_id jeśli nie zostanie określony. |
bigint | Identyfikator transakcji, która utworzyła lub usunęła wersję wiersza. |
Określono przy SEQUENCE_NUMBER_COLUMN_NAME użyciu opcji .
ledger_sequence_number jeśli nie zostanie określony. |
bigint | Numer sekwencji operacji na poziomie wiersza w ramach transakcji w tabeli. |
Określono przy OPERATION_TYPE_COLUMN_NAME użyciu opcji .
ledger_operation_type jeśli nie zostanie określony. |
tinyint | Zawiera 1 (INSERT ) lub 2 (DELETE ). Wstawianie wiersza do tabeli rejestru powoduje utworzenie nowego wiersza w widoku rejestru zawierającego 1 w tej kolumnie. Usunięcie wiersza z tabeli rejestru powoduje utworzenie nowego wiersza w widoku rejestru zawierającego 2 w tej kolumnie. Aktualizowanie wiersza w tabeli rejestru powoduje utworzenie dwóch nowych wierszy w widoku rejestru. Jeden wiersz zawiera 2 (DELETE ) i drugi wiersz zawiera 1 (INSERT ) w tej kolumnie. |
Określono przy OPERATION_TYPE_DESC_COLUMN_NAME użyciu opcji .
ledger_operation_type_desc jeśli nie zostanie określony. |
nvarchar(128) | Zawiera INSERT lub DELETE . Zobacz powyżej, aby uzyskać szczegółowe informacje. |
Transakcje obejmujące tworzenie tabeli rejestru są przechwytywane w sys.database_ledger_transactions.
< >ledger_option ::=
Określa opcję rejestru.
[ LEDGER_VIEW = schema_name. ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ]
Określa nazwę widoku rejestru i nazwy dodatkowych kolumn, które system dodaje do widoku rejestru.
[ APPEND_ONLY = ON | WYŁĄCZONE ]
Określa, czy tworzona tabela rejestru jest tylko do dołączania, czy aktualizowalna. Wartość domyślna to OFF
.
< >ledger_view_option ::=
Określa co najmniej jedną opcję widoku rejestru. Każda z opcji widoku rejestru określa nazwę kolumny, system doda do widoku oprócz kolumn zdefiniowanych w tabeli rejestru.
[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
Określa nazwę kolumny przechowującą identyfikator transakcji, która utworzyła lub usunęła wersję wiersza. Domyślna nazwa kolumny to ledger_transaction_id
.
[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
Określa nazwę kolumn przechowującą numer sekwencji operacji na poziomie wiersza w ramach transakcji w tabeli. Domyślna nazwa kolumny to ledger_sequence_number
.
[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
Określa nazwę kolumn przechowującą identyfikator typu operacji. Domyślna nazwa kolumny to ledger_operation_type.
[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
Określa nazwę kolumn przechowującą opis typu operacji. Domyślna nazwa kolumny to ledger_operation_type_desc
.
Uwagi
Aby uzyskać informacje o liczbie dozwolonych tabel, kolumn, ograniczeń i indeksów, zobacz Maksymalna pojemność specyfikacji dla programu SQL Server.
Miejsce jest zwykle przydzielane do tabel i indeksów w przyrostach jednego zakresu naraz.
SET MIXED_PAGE_ALLOCATION
Jeśli opcja jest ustawiona na wartość TRUE lub zawsze przed programem SQL Server 2016 (13.x), po utworzeniu ALTER DATABASE
tabeli lub indeksu, jest przydzielana strony z mieszanych zakresów, dopóki nie ma wystarczającej liczby stron, aby wypełnić jednolity zakres. Po utworzeniu wystarczającej liczby stron, aby wypełnić jednolity zakres, za każdym razem, gdy obecnie przydzielone zakresy staną się pełne. W przypadku raportu o ilości miejsca przydzielonego i użytego przez tabelę wykonaj polecenie sp_spaceused
.
Aparat bazy danych nie wymusza kolejności, w której ograniczenia DOMYŚLNE, IDENTITY, ROWGUIDCOL lub kolumny są określone w definicji kolumny.
Po utworzeniu tabeli opcja IDENTYFIKATOR CYTOWANY jest zawsze przechowywana jako WŁ. w metadanych tabeli, nawet jeśli opcja jest ustawiona na WARTOŚĆ OFF podczas tworzenia tabeli.
W bazie danych SQL w usłudze Microsoft Fabric można utworzyć niektóre funkcje tabeli, ale nie będą dublowane w usłudze Fabric OneLake. Aby uzyskać więcej informacji, zobacz Ograniczenia dublowania bazy danych SQL w sieci szkieletowej.
Tabele tymczasowe
Można tworzyć lokalne i globalne tabele tymczasowe. Lokalne tabele tymczasowe są widoczne tylko w bieżącej sesji, a globalne tabele tymczasowe są widoczne dla wszystkich sesji. Nie można partycjonować tabel tymczasowych.
Prefiks lokalnych nazw tabel tymczasowych z znakiem jednokrotnym (#table_name
) i prefiksem globalnych nazw tabel tymczasowych z podwójnym znakiem numeru (##table_name
).
Transact-SQL instrukcje odwołują się do tabeli tymczasowej przy użyciu wartości określonej dla table_name w instrukcji CREATE TABLE
, na przykład:
CREATE TABLE #MyTempTable
(
col1 INT PRIMARY KEY
);
INSERT INTO #MyTempTable
VALUES (1);
Jeśli w jednej procedurze składowanej lub wsadowej jest tworzonych więcej niż jedna tabela tymczasowa, muszą mieć różne nazwy.
Jeśli podczas tworzenia lub uzyskiwania dostępu do tabeli tymczasowej dołączysz schema_name , zostanie ona zignorowana. Wszystkie tabele tymczasowe są tworzone w schemacie dbo
.
Jeśli lokalna tabela tymczasowa jest tworzona w procedurze składowanej lub module SQL, który może być wykonywany w tym samym czasie przez kilka sesji, aparat bazy danych musi mieć możliwość odróżnienia tabel utworzonych przez różne sesje. Aparat bazy danych wykonuje to przez wewnętrzne dołączanie unikatowego sufiksu do każdej lokalnej nazwy tabeli tymczasowej. Pełna nazwa tabeli tymczasowej przechowywanej sys.objects
w tabeli w tempdb
tabeli składa się z nazwy tabeli określonej w CREATE TABLE
instrukcji i sufiksu unikatowego wygenerowanego przez system. Aby zezwolić na sufiks, table_name określona dla lokalnej nazwy tymczasowej nie może przekraczać 116 znaków.
Tabele tymczasowe są automatycznie porzucane, gdy wyjdą poza zakres, chyba że zostały jawnie usunięte wcześniej przy użyciu polecenia DROP TABLE
:
- Lokalna tabela tymczasowa utworzona w procedurze składowanej jest porzucana automatycznie po zakończeniu procedury składowanej. Tabela może być przywoływane przez wszystkie zagnieżdżone procedury składowane wykonywane przez procedurę składowaną, która utworzyła tabelę. Nie można odwoływać się do tabeli przez proces, który nazwał procedurę składowaną, która utworzyła tabelę.
- Wszystkie inne lokalne tabele tymczasowe są usuwane automatycznie na końcu bieżącej sesji.
-
GLOBAL_TEMPORARY_TABLE_AUTO_DROP
Jeśli konfiguracja w zakresie bazy danych jest ustawiona na WARTOŚĆ WŁĄCZONE (wartość domyślna), globalne tabele tymczasowe są automatycznie porzucane po zakończeniu sesji, w której utworzono tabelę, a wszystkie inne zadania przestaną odwoływać się do nich. Skojarzenie między zadaniem a tabelą jest zachowywane tylko przez okres życia pojedynczej instrukcji Transact-SQL. Oznacza to, że globalna tabela tymczasowa jest porzucana po zakończeniu ostatniej instrukcji Transact-SQL, która aktywnie odwołuje się do tabeli podczas tworzenia sesji zakończonej. -
GLOBAL_TEMPORARY_TABLE_AUTO_DROP
Jeśli konfiguracja o zakresie bazy danych jest ustawiona na WARTOŚĆ WYŁĄCZONE, globalne tabele tymczasowe są porzucane tylko przy użyciu poleceniaDROP TABLE
lub po ponownym uruchomieniu wystąpienia aparatu bazy danych. Aby uzyskać więcej informacji, zobacz GLOBAL_TEMPORARY_TABLE_AUTO_DROP.
Lokalna tabela tymczasowa utworzona w ramach procedury składowanej lub wyzwalacza może mieć taką samą nazwę jak tabela tymczasowa utworzona przed wywołaną procedurą składowaną lub wyzwalaczem. Jeśli jednak zapytanie odwołuje się do tabeli tymczasowej i dwóch tabel tymczasowych o tej samej nazwie istnieje w tym czasie, nie jest zdefiniowana, której tabeli dotyczy kwerenda. Zagnieżdżone procedury składowane mogą również tworzyć tabele tymczasowe o takiej samej nazwie jak tabela tymczasowa utworzona przez wywoływaną procedurę składowaną. Jednak w przypadku modyfikacji w celu rozpoznania tabeli, która została utworzona w procedurze zagnieżdżonej, tabela musi mieć taką samą strukturę, z tymi samymi nazwami kolumn, co tabela utworzona w procedurze wywołującej. Jest to pokazane w poniższym przykładzie.
CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (2);
SELECT x AS Test2Col
FROM #t;
GO
CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (1);
SELECT x AS Test1Col
FROM #t;
EXECUTE Test2;
GO
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (99);
GO
EXECUTE Test1;
GO
Oto zestaw wyników.
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
Podczas tworzenia lokalnych lub globalnych tabel tymczasowych składnia CREATE TABLE
obsługuje definicje ograniczeń z wyjątkiem FOREIGN KEY
ograniczeń.
FOREIGN KEY
Jeśli ograniczenie jest określone w tabeli tymczasowej, instrukcja zwraca komunikat ostrzegawczy informujący, że ograniczenie zostało pominięte. Tabela jest nadal tworzona FOREIGN KEY
bez ograniczenia. Nie można odwoływać się do tabel tymczasowych w FOREIGN KEY
ograniczeniach.
W przypadku tworzenia tabeli tymczasowej z nazwanym ograniczeniem w zakresie transakcji zdefiniowanej przez użytkownika tylko jeden użytkownik jednocześnie może wykonać instrukcję tworzącą tabelę tymczasową. Jeśli na przykład procedura składowana tworzy tabelę tymczasową z ograniczeniem nazwanego klucza podstawowego, procedura składowana nie może być wykonywana jednocześnie przez wielu użytkowników.
Globalne tabele tymczasowe w zakresie bazy danych w usłudze Azure SQL Database
Globalne tabele tymczasowe w programie SQL Server (nazwy tabel poprzedzone prefiksem ##
) są przechowywane i tempdb
współużytkowane przez wszystkie sesje użytkowników w całym wystąpieniu programu SQL Server.
Usługa Azure SQL Database obsługuje globalne tabele tymczasowe, które są również przechowywane, tempdb
ale są ograniczone do poziomu bazy danych. Oznacza to, że globalne tabele tymczasowe są współużytkowane przez wszystkie sesje użytkowników w tej samej bazie danych. Sesje użytkowników z innych baz danych nie mogą uzyskiwać dostępu do globalnych tabel tymczasowych. W przeciwnym razie globalne tabele tymczasowe dla usługi Azure SQL Database są zgodne z tą samą składnią i semantykami używanymi przez program SQL Server.
Podobnie globalne tymczasowe procedury składowane są również ograniczone do poziomu bazy danych w usłudze Azure SQL Database.
Lokalne tabele tymczasowe (nazwy tabel poprzedzone prefiksem #
) są również obsługiwane dla usługi Azure SQL Database i są zgodne z tą samą składnią i semantykami używanymi przez program SQL Server. Aby uzyskać więcej informacji, zobacz Tabele tymczasowe.
Uprawnienia do obiektów tymczasowych
Każdy użytkownik może tworzyć i uzyskiwać dostęp do obiektów tymczasowych.
Tabele partycjonowane
Przed utworzeniem tabeli partycjonowanej przy użyciu polecenia CREATE TABLE należy najpierw utworzyć funkcję partycji, aby określić sposób partycjonowania tabeli. Funkcja partycji jest tworzona przy użyciu funkcji CREATE PARTITION. Po drugie, należy utworzyć schemat partycji, aby określić grupy plików, które będą przechowywać partycje wskazane przez funkcję partycji. Schemat partycji jest tworzony przy użyciu schematu CREATE PARTITION SCHEME. Nie można określić umieszczania klucza PODSTAWOWEgo lub unikatowych ograniczeń dla oddzielnych grup plików dla tabel partycjonowanych. Aby uzyskać więcej informacji, zobacz Partycjonowane tabele i indeksy.
Ograniczenia KLUCZA PODSTAWOWEGO
Tabela może zawierać tylko jedno ograniczenie KLUCZA PODSTAWOWEgo.
Indeks wygenerowany przez ograniczenie KLUCZA PODSTAWOWEgo nie może spowodować, że liczba indeksów w tabeli przekroczy 999 indeksów nieklastrowanych i 1 indeks klastrowany.
Jeśli parametr CLUSTERED lub NONCLUSTERED nie jest określony dla ograniczenia KLUCZA PODSTAWOWEgo, klasterED jest używany, jeśli nie określono żadnych indeksów klastrowanych określonych dla unikatowych ograniczeń.
Wszystkie kolumny zdefiniowane w ramach ograniczenia KLUCZA PODSTAWOWEgo muszą być zdefiniowane jako NOT NULL. Jeśli nie określono wartości null, wszystkie kolumny uczestniczące w ograniczeniu KLUCZ PODSTAWOWY mają ich wartość null ustawioną na WARTOŚĆ NOT NULL.
Uwaga / Notatka
W przypadku tabel zoptymalizowanych pod kątem pamięci dozwolona jest kolumna klucza dopuszczana do wartości null.
Jeśli klucz podstawowy jest zdefiniowany w kolumnie typu zdefiniowanego przez użytkownika CLR, implementacja typu musi obsługiwać porządkowanie binarne. Aby uzyskać więcej informacji, zobacz Typy zdefiniowane przez użytkownika CLR.
Ograniczenia UNIQUE
- Jeśli parametr CLUSTERED lub NONCLUSTERED nie jest określony dla ograniczenia UNIKATOWEGO, domyślnie jest używana WARTOŚĆ NONCLUSTERED.
- Każde ograniczenie UNIQUE generuje indeks. Liczba ograniczeń UNIKATOWYch nie może spowodować, że liczba indeksów w tabeli przekroczy 999 indeksów nieklastrowanych i 1 indeks klastrowany.
- Jeśli unikatowe ograniczenie jest zdefiniowane w kolumnie typu zdefiniowanego przez użytkownika CLR, implementacja typu musi obsługiwać porządkowanie binarne lub oparte na operatorach. Aby uzyskać więcej informacji, zobacz Typy zdefiniowane przez użytkownika CLR.
Ograniczenia KLUCZA OBCEGO
Gdy wartość inna niż NULL jest wprowadzana w kolumnie ograniczenia KLUCZ OBCY, wartość musi istnieć w kolumnie, do których się odwołujesz; w przeciwnym razie zwracany jest komunikat o błędzie naruszenia klucza obcego.
Ograniczenia KLUCZA OBCEgo są stosowane do poprzedniej kolumny, chyba że określono kolumny źródłowe.
Ograniczenia klucza obcego mogą odwoływać się tylko do tabel w tej samej bazie danych na tym samym serwerze. Integralność referencyjna między bazami danych musi być zaimplementowana za pośrednictwem wyzwalaczy. Aby uzyskać więcej informacji, zobacz CREATE TRIGGER (WYZWALACZ CREATE).
Ograniczenia KLUCZA OBCEgo mogą odwoływać się do innej kolumny w tej samej tabeli. Jest to nazywane odwołaniem własnym.
Klauzula REFERENCES ograniczenia KLUCZA OBCEgo na poziomie kolumny może zawierać tylko jedną kolumnę odwołania. Ta kolumna musi mieć ten sam typ danych co kolumna, w której zdefiniowano ograniczenie.
Klauzula REFERENCES ograniczenia KLUCZA OBCEGO na poziomie tabeli musi zawierać taką samą liczbę kolumn odwołań, jak liczba kolumn na liście kolumn ograniczeń. Typ danych każdej kolumny odwołania musi być również taki sam jak odpowiednia kolumna na liście kolumn. Kolumny odwołania muszą być określone w tej samej kolejności, która została użyta podczas określania kolumn klucza podstawowego lub unikatowego ograniczenia w tabeli, do którego odwołuje się odwołanie.
Nie można określić wartości CASCADE, SET NULL lub SET DEFAULT, jeśli kolumna sygnatury czasowej typu jest częścią klucza obcego lub klucza, do których odwołuje się odwołanie.
CASCADE, SET NULL, SET DEFAULT i NO ACTION można łączyć w tabelach, które mają relacje odwołania ze sobą. Jeśli aparat bazy danych nie napotka żadnej akcji, zatrzymuje i przywraca powiązane akcje CASCADE, USTAW WARTOŚĆ NULL i USTAW WARTOŚĆ DOMYŚLNĄ. Gdy instrukcja DELETE powoduje kombinację akcji CASCADE, SET NULL, SET DEFAULT i NO ACTION, wszystkie akcje CASCADE, SET NULL i SET DEFAULT są stosowane przed sprawdzeniem przez aparat bazy danych żadnej akcji BEZ akcji.
Aparat bazy danych nie ma wstępnie zdefiniowanego limitu liczby ograniczeń klucza obcego, które tabela może zawierać odwołanie do innych tabel lub liczbę ograniczeń klucza obcego należących do innych tabel odwołujących się do określonej tabeli.
Niemniej jednak rzeczywista liczba ograniczeń klucza obcego, które mogą być używane, jest ograniczona przez konfigurację sprzętu i projekt bazy danych i aplikacji. Zalecamy, aby tabela nie zawierała więcej niż 253 ograniczeń klucza obcego i że odwołuje się do niej nie więcej niż 253 ograniczenia klucza obcego. Efektywny limit może być większy lub mniejszy w zależności od aplikacji i sprzętu. Podczas projektowania bazy danych i aplikacji należy wziąć pod uwagę koszty wymuszania ograniczeń klucza obcego.
Ograniczenia klucza obcego nie są wymuszane w tabelach tymczasowych.
Ograniczenia KLUCZA OBCEgo mogą odwoływać się tylko do kolumn w kluczu PODSTAWOWYM lub unikatowych ograniczeniach w tabeli, do których odwołuje się odwołanie, lub w indeksie UNIKATOWYm w tabeli, do których odwołuje się odwołanie.
Jeśli klucz obcy jest zdefiniowany w kolumnie typu zdefiniowanego przez użytkownika CLR, implementacja typu musi obsługiwać porządkowanie binarne. Aby uzyskać więcej informacji, zobacz Typy zdefiniowane przez użytkownika CLR.
Kolumny uczestniczące w relacji klucza obcego muszą być zdefiniowane z taką samą długością i skalą.
Definicje DOMYŚLNE
Kolumna może mieć tylko jedną definicję DOMYŚLNą.
Definicja DOMYŚLNa może zawierać stałe wartości, funkcje, standardowe funkcje języka SQL , funkcje niladyczne lub
NULL
. W poniższej tabeli przedstawiono funkcje niladic i wartości zwracane dla wartości domyślnej podczas instrukcji INSERT.SQL-92 niladic, funkcja Zwrócona wartość CURRENT_TIMESTAMP
Bieżąca data i godzina. CURRENT_USER
Nazwa użytkownika wykonującego wstawianie. SESSION_USER
Nazwa użytkownika wykonującego wstawianie. SYSTEM_USER
Nazwa użytkownika wykonującego wstawianie. USER
Nazwa użytkownika wykonującego wstawianie. constant_expression w definicji DOMYŚLNEj nie może odwoływać się do innej kolumny w tabeli ani do innych tabel, widoków ani procedur składowanych.
Nie można utworzyć definicji DOMYŚLNYch w kolumnach z typem danych sygnatury czasowej lub kolumnami z właściwością IDENTITY.
Nie można utworzyć definicji DOMYŚLNYch dla kolumn z typami danych aliasu, jeśli typ danych aliasu jest powiązany z obiektem domyślnym.
SPRAWDZANIE ograniczeń
Kolumna może mieć dowolną liczbę ograniczeń CHECK, a warunek może zawierać wiele wyrażeń logicznych w połączeniu z elementami AND i OR. Wiele ograniczeń CHECK dla kolumny jest weryfikowanych w kolejności ich tworzenia.
Warunek wyszukiwania musi zostać obliczony na wyrażenie logiczne i nie może odwoływać się do innej tabeli.
Ograniczenie CHECK na poziomie kolumny może odwoływać się tylko do ograniczonej kolumny, a ograniczenie CHECK na poziomie tabeli może odwoływać się tylko do kolumn w tej samej tabeli.
SPRAWDZANIE OGRANICZEŃ i reguł pełni tę samą funkcję sprawdzania poprawności danych podczas instrukcji INSERT i UPDATE.
Jeśli dla kolumny lub kolumn istnieje reguła i co najmniej jedno ograniczenie CHECK, zostaną ocenione wszystkie ograniczenia.
Nie można zdefiniować ograniczeń CHECK w kolumnach tekstowych, ntekstowych ani obrazów .
Dalsze informacje o ograniczeniu
- Nie można porzucić indeksu utworzonego dla ograniczenia przy użyciu polecenia
DROP INDEX
; ograniczenie musi zostać usunięte przy użyciu poleceniaALTER TABLE
. Indeks utworzony dla i używany przez ograniczenie można ponownie skompilować przy użyciu poleceniaALTER INDEX ... REBUILD
. Aby uzyskać więcej informacji, zobacz Zorganizuj i przebuduj indeksy. - Nazwy ograniczeń muszą być zgodne z regułami dotyczącymi identyfikatorów, z tą różnicą, że nazwa nie może zaczynać się od znaku numeru (#). Jeśli constraint_name nie zostanie podana, do ograniczenia zostanie przypisana nazwa wygenerowana przez system. Nazwa ograniczenia jest wyświetlana w dowolnym komunikacie o błędzie dotyczącym naruszeń ograniczeń.
- Gdy ograniczenie zostanie naruszone w instrukcji
INSERT
,UPDATE
lubDELETE
, instrukcja zostanie zakończona. Jeśli jednakSET XACT_ABORT
jest ustawiona wartość OFF, transakcja, jeśli instrukcja jest częścią jawnej transakcji, będzie nadal przetwarzana. GdySET XACT_ABORT
jest ustawiona wartość WŁĄCZONE, cała transakcja zostanie wycofana. Możesz również użyćROLLBACK TRANSACTION
instrukcji z definicją transakcji, sprawdzając funkcję systemową@@ERROR
. - Gdy
ALLOW_ROW_LOCKS = ON
podczas uzyskiwania dostępu do indeksu dozwolone są blokady na poziomie wiersza, strony i tabeli oraz , iALLOW_PAGE_LOCK = ON
. Aparat bazy danych wybiera odpowiednią blokadę i może eskalować blokadę z wiersza lub blokady strony do blokady tabeli. W przypadkuALLOW_ROW_LOCKS = OFF
iALLOW_PAGE_LOCK = OFF
tylko blokada na poziomie tabeli jest dozwolona podczas uzyskiwania dostępu do indeksu. - Jeśli w tabeli znajduje się KLUCZ OBCY LUB SPRAWDŹ OGRANICZENIA i wyzwalacze, warunki ograniczenia są oceniane przed wykonaniem wyzwalacza.
W przypadku raportu w tabeli i jej kolumnach użyj polecenia sp_help
lub sp_helpconstraint
. Aby zmienić nazwę tabeli, użyj polecenia sp_rename
. W przypadku raportu dotyczącego widoków i procedur składowanych, które zależą od tabeli, użyj sys.dm_sql_referenced_entities i sys.dm_sql_referencing_entities.
Reguły dopuszczania wartości null w definicji tabeli
Wartość null kolumny określa, czy ta kolumna może zezwalać na wartość null (NULL
) jako dane w tej kolumnie.
NULL
nie jest zerowa lub pusta: NULL
oznacza, że nie podano wpisu ani nie podano jawnego NULL
wpisu i zazwyczaj oznacza to, że wartość jest nieznana lub nie dotyczy.
Jeśli używasz CREATE TABLE
polecenia lub ALTER TABLE
do tworzenia lub zmieniania tabeli, ustawienia bazy danych i sesji mają wpływ i ewentualnie przesłaniają wartość null typu danych używanego w definicji kolumny. Zalecamy, aby zawsze jawnie zdefiniować kolumnę jako NULL lub NOT NULL dla kolumn niekompilowanych lub, jeśli używasz typu danych zdefiniowanego przez użytkownika, zezwalasz kolumnie na używanie domyślnej wartości null typu danych. Kolumny rozrzedłe muszą zawsze zezwalać na wartość NULL.
Jeśli wartość null kolumny nie jest jawnie określona, wartość null kolumny jest zgodna z regułami przedstawionymi w poniższej tabeli.
Typ danych kolumny | Reguła |
---|---|
Typ danych aliasu | Aparat bazy danych używa wartości null określonej podczas tworzenia typu danych. Aby określić domyślną wartość null typu danych, użyj polecenia sp_help . |
Typ zdefiniowany przez użytkownika środowiska CLR | Wartość null jest określana zgodnie z definicją kolumny. |
Typ danych dostarczony przez system | Jeśli typ danych dostarczony przez system ma tylko jedną opcję, ma pierwszeństwo. Typy danych sygnatury czasowej nie mogą mieć wartości NULL. Gdy wszystkie ustawienia sesji są ustawione przy użyciu polecenia SET :ANSI_NULL_DFLT_ON = ON , przypisano wartość NULL.ANSI_NULL_DFLT_OFF = ON , nie jest przypisywana wartość NULL.Jeśli wszystkie ustawienia bazy danych są konfigurowane przy użyciu polecenia ALTER DATABASE :ANSI_NULL_DEFAULT_ON = ON , przypisano wartość NULL.ANSI_NULL_DEFAULT_OFF = ON , nie jest przypisywana wartość NULL.Aby wyświetlić ustawienie bazy danych dla ANSI_NULL_DEFAULT elementu , użyj sys.databases widoku wykazu |
Jeśli żadna z opcji ANSI_NULL_DFLT nie jest ustawiona dla sesji, a baza danych jest ustawiona na wartość domyślną (ANSI_NULL_DEFAULT jest wyłączona), zostanie przypisana wartość domyślna NOT NULL.
Jeśli kolumna jest kolumną obliczeniową, jej wartość null jest zawsze automatycznie określana przez aparat bazy danych. Aby dowiedzieć się, jak dopuszczać wartość null dla tego typu kolumny, użyj COLUMNPROPERTY
funkcji z właściwością AllowsNull .
Uwaga / Notatka
Sterownik ODBC programu SQL Server i sterownik OLE DB programu SQL Server są domyślnie ustawione na ANSI_NULL_DFLT_ON wartość WŁĄCZONE. Użytkownicy ODBC i OLE DB mogą to skonfigurować w źródłach danych ODBC lub z atrybutami połączenia lub właściwościami ustawionymi przez aplikację.
Kompresja danych
Nie można włączyć tabel systemowych na potrzeby kompresji. Podczas tworzenia tabeli kompresja danych jest ustawiona na NONE, chyba że określono inaczej. Jeśli określisz listę partycji lub partycję, która jest poza zakresem, zostanie wygenerowany błąd. Aby uzyskać więcej informacji na temat kompresji danych, zobacz Kompresja danych.
Aby ocenić, jak zmiana stanu kompresji wpłynie na tabelę, indeks lub partycję, użyj procedury składowanej sp_estimate_data_compression_savings.
Uprawnienia
Wymaga CREATE TABLE
uprawnień w bazie danych i ALTER
uprawnienia do schematu, w którym jest tworzona tabela.
Jeśli jakiekolwiek kolumny w instrukcji CREATE TABLE
są zdefiniowane jako typ zdefiniowany przez użytkownika, REFERENCES
wymagane jest uprawnienie do typu zdefiniowanego przez użytkownika.
Jeśli jakiekolwiek kolumny w instrukcji CREATE TABLE
są zdefiniowane jako typ zdefiniowany przez użytkownika CLR, wymagana jest własność typu lub REFERENCES
uprawnienia.
Jeśli jakiekolwiek kolumny w instrukcji CREATE TABLE
mają skojarzona kolekcja schematów XML, wymagana jest własność kolekcji schematów XML lub REFERENCES
uprawnienie.
Każdy użytkownik może tworzyć tabele tymczasowe w programie tempdb
.
Jeśli instrukcja tworzy tabelę rejestru, ENABLE LEDGER
wymagane jest uprawnienie.
Przykłady
Odp. Tworzenie ograniczenia KLUCZA PODSTAWOWEgo w kolumnie
W poniższym przykładzie przedstawiono definicję kolumny ograniczenia KLUCZ PODSTAWOWY z indeksem klastrowanym w EmployeeID
kolumnie Employee
tabeli. Ponieważ nazwa ograniczenia nie jest określona, system dostarcza nazwę ograniczenia.
CREATE TABLE dbo.Employee
(
EmployeeID INT PRIMARY KEY CLUSTERED
);
B. Używanie ograniczeń KLUCZA OBCEGO
Ograniczenie KLUCZA OBCEgo służy do odwołowywania się do innej tabeli. Klucze obce mogą być kluczami jednokolumnowym lub kluczami wielokolumnowym. W poniższym przykładzie przedstawiono jednokolumnowe ograniczenie KLUCZA OBCEgo SalesOrderHeader
w tabeli odwołującej się do SalesPerson
tabeli. Tylko klauzula REFERENCES jest wymagana dla jednokolumnowego ograniczenia KLUCZA OBCEGO.
SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)
Możesz również jawnie użyć klauzuli FOREIGN KEY i ponownie użyć atrybutu kolumny. Nazwa kolumny nie musi być taka sama w obu tabelach.
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)
Ograniczenia klucza wielokolumnowego są tworzone jako ograniczenia tabeli.
AdventureWorks2022
W bazie danych SpecialOfferProduct
tabela zawiera wielokolumnowy KLUCZ PODSTAWOWY. W poniższym przykładzie pokazano, jak odwoływać się do tego klucza z innej tabeli. jawna nazwa ograniczenia jest opcjonalna.
CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
FOREIGN KEY (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
C. Używanie ograniczeń UNIKATOWYch
Unikatowe ograniczenia są używane do wymuszania unikatowości w kolumnach kluczy innych niżprimary. Poniższy przykład wymusza ograniczenie, że kolumna Name
Product
tabeli musi być unikatowa.
Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED
D. Używanie definicji DOMYŚLNYch
Wartości domyślne udostępniają wartość (z instrukcjami INSERT i UPDATE), gdy nie podano żadnej wartości. Na przykład AdventureWorks2022
baza danych może zawierać tabelę odnośników zawierającą listę różnych pracowników, które pracownicy mogą wypełnić w firmie. W kolumnie, która opisuje każde zadanie, wartość domyślna ciągu znaku może podać opis, gdy rzeczywisty opis nie zostanie wprowadzony jawnie.
DEFAULT 'New Position - title not formalized yet'
Oprócz stałych definicje DOMYŚLNE mogą zawierać funkcje. Użyj poniższego przykładu, aby uzyskać bieżącą datę wpisu.
DEFAULT (GETDATE())
Skanowanie funkcji niladic-function może również poprawić integralność danych. Aby śledzić użytkownika, który wstawił wiersz, użyj funkcji niladic-function dla elementu USER. Nie otaczaj funkcji niladic-przy użyciu nawiasów.
DEFAULT USER
E. Korzystanie z ograniczeń CHECK
W poniższym przykładzie przedstawiono ograniczenie wprowadzone do wartości wprowadzonych w CreditRating
kolumnie Vendor
tabeli. Ograniczenie jest nienazwane.
CHECK (CreditRating >= 1 and CreditRating <= 5)
W tym przykładzie pokazano nazwane ograniczenie z ograniczeniem wzorca dla danych znaków wprowadzonych w kolumnie tabeli.
CONSTRAINT CK_emp_id CHECK (
emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
)
W tym przykładzie określono, że wartości muszą znajdować się na określonej liście lub postępować zgodnie z określonym wzorcem.
CHECK (
emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]'
)
F. Pokaż pełną definicję tabeli
W poniższym przykładzie przedstawiono pełne definicje tabeli ze wszystkimi definicjami ograniczeń dla tabeli PurchaseOrderDetail
utworzonej AdventureWorks2022
w bazie danych. Aby uruchomić przykład, schemat tabeli został zmieniony na dbo
.
CREATE TABLE dbo.PurchaseOrderDetail
(
PurchaseOrderID INT NOT NULL FOREIGN KEY REFERENCES Purchasing.PurchaseOrderHeader (PurchaseOrderID),
LineNumber SMALLINT NOT NULL,
ProductID INT NULL FOREIGN KEY REFERENCES Production.Product (ProductID),
UnitPrice MONEY NULL,
OrderQty SMALLINT NULL,
ReceivedQty FLOAT NULL,
RejectedQty FLOAT NULL,
DueDate DATETIME NULL,
rowguid UNIQUEIDENTIFIER CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()) ROWGUIDCOL NOT NULL,
ModifiedDate DATETIME CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()) NOT NULL,
LineTotal AS ((UnitPrice * OrderQty)),
StockedQty AS ((ReceivedQty - RejectedQty)),
CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber) WITH (IGNORE_DUP_KEY = OFF)
) ON [PRIMARY];
G. Tworzenie tabeli z kolumną XML typizowanej w kolekcji schematów XML
Poniższy przykład tworzy tabelę z kolumną xml
typową do kolekcji HRResumeSchemaCollection
schematów XML . Słowo DOCUMENT
kluczowe określa, że każde wystąpienie xml
typu danych w column_name może zawierać tylko jeden element najwyższego poziomu.
CREATE TABLE HumanResources.EmployeeResumes
(
LName NVARCHAR (25),
FName NVARCHAR (25),
Resume XML(DOCUMENT HumanResources.HRResumeSchemaCollection)
);
H. Tworzenie tabeli partycjonowanej
Poniższy przykład tworzy funkcję partycji, aby podzielić tabelę lub indeks na cztery partycje. Następnie przykład tworzy schemat partycji, który określa grupy plików, w których mają być przechowywane każda z czterech partycji. Na koniec przykład tworzy tabelę, która używa schematu partycji. W tym przykładzie przyjęto założenie, że grupy plików już istnieją w bazie danych.
CREATE PARTITION FUNCTION myRangePF1(INT)
AS RANGE LEFT
FOR VALUES (1, 100, 1000);
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg);
GO
CREATE TABLE PartitionTable
(
col1 INT,
col2 CHAR (10)
) ON myRangePS1 (col1);
GO
Na podstawie wartości kolumny col1
PartitionTable
partycje są przypisywane w następujący sposób.
Grupa plików | test1fg | test2fg | test3fg | test4fg |
---|---|---|---|---|
Partycja | 1 | 2 | 3 | 4 |
Wartości | col 1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <= 1,000 |
col1 > 1000 |
Ja. Używanie typu danych UNIQUEIDENTIFIER w kolumnie
Poniższy przykład tworzy tabelę z kolumną uniqueidentifier
. W przykładzie użyto ograniczenia KLUCZ PODSTAWOWY, aby chronić tabelę przed wstawieniem zduplikowanych wartości przez użytkowników i używa NEWSEQUENTIALID()
funkcji w ograniczeniu DEFAULT
, aby podać wartości dla nowych wierszy. Właściwość ROWGUIDCOL jest stosowana do uniqueidentifier
kolumny, aby można było do niej odwoływać się przy użyciu słowa kluczowego $ROWGUID.
CREATE TABLE dbo.Globally_Unique_Data
(
GUID UNIQUEIDENTIFIER CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Employee_Name VARCHAR (60) CONSTRAINT Guid_PK PRIMARY KEY (GUID)
);
J. Używanie wyrażenia dla kolumny obliczeniowej
W poniższym przykładzie pokazano użycie wyrażenia ((low + high)/2
) do obliczania obliczonej myavg
kolumny.
CREATE TABLE dbo.mytable
(
low INT,
high INT,
myavg AS (low + high) / 2
);
K. Tworzenie obliczonej kolumny na podstawie kolumny typu zdefiniowanego przez użytkownika
Poniższy przykład tworzy tabelę z jedną kolumną zdefiniowaną jako typ utf8string
zdefiniowany przez użytkownika, przy założeniu, że zestaw typu i sam typ zostały już utworzone w bieżącej bazie danych. Druga kolumna jest definiowana na utf8string
podstawie metody i używa metody ToString()
type(class)utf8string
do obliczenia wartości dla kolumny.
CREATE TABLE UDTypeTable
(
u UTF8STRING,
ustr AS u.ToString() PERSISTED
);
L. Używanie funkcji USER_NAME dla obliczonej kolumny
W poniższym przykładzie użyto USER_NAME()
funkcji w kolumnie myuser_name
.
CREATE TABLE dbo.mylogintable
(
date_in DATETIME,
user_id INT,
myuser_name AS USER_NAME()
);
M. Tworzenie tabeli zawierającej kolumnę FILESTREAM
Poniższy przykład tworzy tabelę zawierającą kolumnę FILESTREAM
Photo
. Jeśli tabela zawiera co FILESTREAM
najmniej jedną kolumnę, tabela musi mieć jedną ROWGUIDCOL
kolumnę.
CREATE TABLE dbo.EmployeePhoto
(
EmployeeId INT NOT NULL PRIMARY KEY,
Photo VARBINARY (MAX) FILESTREAM NULL,
MyRowGuidColumn UNIQUEIDENTIFIER DEFAULT NEWID() ROWGUIDCOL NOT NULL UNIQUE
);
N. Tworzenie tabeli korzystającej z kompresji wierszy
Poniższy przykład tworzy tabelę korzystającą z kompresji wierszy.
CREATE TABLE dbo.T1
(
c1 INT,
c2 NVARCHAR (200)
)
WITH (DATA_COMPRESSION = ROW);
Aby uzyskać dodatkowe przykłady kompresji danych, zobacz Kompresja danych.
O. Tworzenie tabeli korzystającej z kompresji XML
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.
Poniższy przykład tworzy tabelę korzystającą z kompresji XML.
CREATE TABLE dbo.T1
(
c1 INT,
c2 XML
)
WITH (XML_COMPRESSION = ON);
P. Tworzenie tabeli zawierającej rozrzedzona kolumna i zestaw kolumn
W poniższych przykładach pokazano, jak utworzyć tabelę zawierającą rozrzedzona kolumnę oraz tabelę zawierającą dwie rozrzedzona kolumna i zestaw kolumn. W przykładach użyto podstawowej składni. Aby uzyskać bardziej złożone przykłady, zobacz Używanie kolumn rozrzednych i Używanie zestawów kolumn.
W tym przykładzie zostanie utworzona tabela zawierająca rozrzedliwą kolumnę.
CREATE TABLE dbo.T1
(
c1 INT PRIMARY KEY,
c2 VARCHAR (50) SPARSE NULL
);
W tym przykładzie zostanie utworzona tabela zawierająca dwie rozrzedzona kolumna i zestaw kolumn o nazwie CSet
.
CREATE TABLE T1
(
c1 INT PRIMARY KEY,
c2 VARCHAR (50) SPARSE NULL,
c3 INT SPARSE NULL,
CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
);
Pytanie Tworzenie tabeli czasowej opartej na dyskach w wersji systemowej
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
W poniższych przykładach pokazano, jak utworzyć tabelę czasową połączoną z nową tabelą historii oraz jak utworzyć tabelę czasową połączoną z istniejącą tabelą historii. Tabela czasowa musi mieć zdefiniowany klucz podstawowy, aby można było włączyć obsługę przechowywania wersji systemu w tabeli. Przykłady przedstawiające sposób dodawania lub usuwania wersji systemu w istniejącej tabeli można znaleźć w temacie Obsługa wersji systemu w przykładach. W przypadku przypadków użycia zobacz Tabele czasowe.
W tym przykładzie zostanie utworzona nowa tabela czasowa połączona z nową tabelą historii.
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
W tym przykładzie zostanie utworzona nowa tabela czasowa połączona z istniejącą tabelą historii.
-- Existing table
CREATE TABLE Department_History
(
DepartmentNumber CHAR (10) NOT NULL,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 NOT NULL,
ValidTo DATETIME2 NOT NULL
);
-- Temporal table
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));
R. Tworzenie tabeli czasowej zoptymalizowanej pod kątem pamięci w wersji systemowej
Dotyczy: SQL Server 2016 (13.x) i nowsze oraz Azure SQL Database.
W poniższym przykładzie pokazano, jak utworzyć tabelę czasową zoptymalizowaną pod kątem wersji systemu połączoną z nową tabelą historii opartą na dyskach.
W tym przykładzie zostanie utworzona nowa tabela czasowa połączona z nową tabelą historii.
CREATE SCHEMA History;
GO
CREATE TABLE dbo.Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY NONCLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA, SYSTEM_VERSIONING = ON (HISTORY_TABLE=History.DepartmentHistory));
W tym przykładzie zostanie utworzona nowa tabela czasowa połączona z istniejącą tabelą historii.
-- Existing table
CREATE TABLE Department_History
(
DepartmentNumber CHAR (10) NOT NULL,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 NOT NULL,
ValidTo DATETIME2 NOT NULL
);
-- Temporal table
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));
S. Tworzenie tabeli z zaszyfrowanymi kolumnami
Poniższy przykład tworzy tabelę z dwiema zaszyfrowanymi kolumnami. Aby uzyskać więcej informacji, zobacz Always Encrypted.
CREATE TABLE Customers
(
CustName NVARCHAR (60) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
),
SSN VARCHAR (11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
),
Age INT NULL
);
T. Tworzenie indeksu filtrowanego śródliniowego
Tworzy tabelę z wbudowanym indeksem filtrowanym.
CREATE TABLE t1
(
c1 INT,
INDEX IX1 (c1) WHERE c1 > 0
);
U. Tworzenie indeksu wbudowanego
Poniżej pokazano, jak używać wbudowanych instrukcji NONCLUSTERED dla tabel opartych na dyskach:
CREATE TABLE t1
(
c1 INT,
INDEX ix_1 NONCLUSTERED (c1)
);
CREATE TABLE t2
(
c1 INT,
c2 INT INDEX ix_1 NONCLUSTERED
);
CREATE TABLE t3
(
c1 INT,
c2 INT,
INDEX ix_1 NONCLUSTERED (c1, c2)
);
V. Tworzenie tabeli tymczasowej z anonimowo nazwanym kluczem podstawowym złożonym
Tworzy tabelę z anonimowo nazwanym kluczem podstawowym złożonym. Jest to przydatne, aby uniknąć konfliktów czasu wykonywania, w których dwie tabele tymczasowe o zakresie sesji, z których każda znajduje się w oddzielnej sesji, używają tej samej nazwy dla ograniczenia.
CREATE TABLE #tmp
(
c1 INT,
c2 INT,
PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO
Jeśli jawnie nadasz ograniczeniu nazwę, druga sesja wygeneruje błąd, taki jak:
Msg 2714, Level 16, State 5, Line 1
There is already an object named 'PK_#tmp' in the database.
Msg 1750, Level 16, State 1, Line 1
Could not create constraint or index. See previous errors.
Problem wynika z faktu, że chociaż nazwa tabeli tymczasowej jest unikatowa, nazwy ograniczeń nie są.
W. Używanie globalnych tabel tymczasowych w usłudze Azure SQL Database
Sesja A tworzy globalną tabelę temp ##test w usłudze Azure SQL Database testdb1 i dodaje jeden wiersz
CREATE TABLE ##test
(
a INT,
b INT
);
INSERT INTO ##test
VALUES (1, 1);
-- Obtain object ID for temp table ##test
SELECT OBJECT_ID('tempdb.dbo.##test') AS 'Object ID';
Oto zestaw wyników.
1253579504
Uzyskiwanie globalnej nazwy tabeli tymczasowej dla danego identyfikatora obiektu 1253579504 w ( tempdb
2)
SELECT name
FROM tempdb.sys.objects
WHERE object_id = 1253579504;
Oto zestaw wyników.
##test
Sesja B łączy się z usługą Azure SQL Database testdb1 i może uzyskać dostęp do tabeli ##test utworzonej przez sesję A
SELECT *
FROM ##test;
Oto zestaw wyników.
1, 1
Sesja C łączy się z inną bazą danych w usłudze Azure SQL Database testdb2 i chce uzyskać dostęp do pliku ##test utworzonego w bazie danych testdb1. Ten wybór kończy się niepowodzeniem z powodu zakresu bazy danych dla globalnych tabel tymczasowych
SELECT *
FROM ##test;
Spowoduje to wygenerowanie następującego błędu:
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'
Zwracanie się do obiektu systemowego w usłudze Azure SQL Database tempdb
z bieżącej bazy danych użytkownika testdb1
SELECT *
FROM tempdb.sys.objects;
SELECT *
FROM tempdb.sys.columns;
SELECT *
FROM tempdb.sys.database_files;
X. Włączanie zasad przechowywania danych w tabeli
Poniższy przykład tworzy tabelę z włączonym przechowywaniem danych i okresem przechowywania w ciągu jednego tygodnia. Ten przykład dotyczy tylko usługi Azure SQL Edge .
CREATE TABLE [dbo].[data_retention_table]
(
[dbdatetime2] DATETIME2 (7),
[product_code] INT,
[value] CHAR (10)
)
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ) );
Y. Tworzenie tabeli rejestru z możliwością aktualizowania
Poniższy przykład tworzy tabelę rejestru, która nie jest tabelą czasową z anonimową tabelą historii (system wygeneruje nazwę tabeli historii) i wygenerowaną nazwą widoku rejestru. Ponieważ nazwy wymaganych wygenerowanych zawsze kolumn i dodatkowe kolumny w widoku rejestru nie są określone, kolumny będą miały nazwy domyślne.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL,
Salary MONEY NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO
Poniższy przykład tworzy tabelę, która jest zarówno tabelą czasową, jak i tabelą rejestru, z tabelą historii anonimowej (o nazwie wygenerowanej przez system), wygenerowaną nazwą widoku rejestru oraz domyślnymi nazwami wygenerowanych zawsze kolumn oraz dodatkowymi kolumnami widoku rejestru.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL PRIMARY KEY,
Salary MONEY NOT NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO
Poniższy przykład tworzy tabelę, która jest zarówno tabelą czasową, jak i tabelą rejestru z jawnie nazwaną tabelą historii, określoną przez użytkownika nazwą widoku rejestru oraz nazwami określonymi przez użytkownika wygenerowanymi zawsze kolumnami i dodatkowymi kolumnami w widoku rejestru.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL PRIMARY KEY,
Salary MONEY NOT NULL,
StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
EndTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL,
StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL,
EndSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[HR].[EmployeesHistory]), LEDGER = ON (LEDGER_VIEW=[HR].[EmployeesLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription)));
GO
Poniższy przykład tworzy tabelę rejestru tylko do dołączania z wygenerowanymi nazwami widoku rejestru i kolumnami w widoku rejestru.
CREATE SCHEMA [AccessControl];
GO
CREATE TABLE [AccessControl].[KeyCardEvents]
(
EmployeeID INT NOT NULL,
AccessOperationDescription NVARCHAR (MAX) NOT NULL,
[Timestamp] DATETIME2 NOT NULL,
StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
)
WITH (LEDGER = ON (LEDGER_VIEW=[AccessControl].[KeyCardEventsLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription),APPEND_ONLY= ON));
GO
W poniższym przykładzie utworzono bazę danych rejestru w usłudze Azure SQL Database i tabelę rejestru z możliwością aktualizowania przy użyciu ustawień domyślnych. Tworzenie tabeli rejestru z możliwością aktualizowania w bazie danych rejestru nie wymaga użycia metody WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
.
CREATE DATABASE MyLedgerDB
(EDITION = 'GeneralPurpose')
WITH LEDGER = ON;
GO
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL,
Salary MONEY NOT NULL
);
GO