Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Vytvoří novou tabulku v databázi.
Note
Odkaz na Sklad v Microsoft Fabric najdete v tématu CREATE TABLE (Fabric Data Warehouse). Pokud chcete odkazovat na Azure Synapse Analytics a Platform Platform System (PDW), navštivte create TABLE (Azure Synapse Analytics).
Syntaktické možnosti
Běžná syntax
Jednoduchá syntaxe CREATE TABLE (běžné, pokud nepoužíváte možnosti):
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition> } [ ,... n ] )
[ ; ]
Plná syntax
Syntaxe CREATE TABLE založená na disku:
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
[ , HISTORY_RETENTION_PERIOD = <history_retention_period> ]
[ , 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>
Syntaxe pro tabulky optimalizované pro paměť
Syntaxe CREATE TABLE optimalizovaná pro paměť:
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 } ] ) ]
}
Arguments
database_name
Název databáze, ve které je tabulka vytvořena. database_name musí zadat název existující databáze. Pokud není zadáno, database_name výchozí hodnota aktuální databáze. Přihlášení k aktuálnímu připojení musí být přidružené k existujícímu ID uživatele v databázi určené database_name a toto ID uživatele musí mít oprávnění CREATE TABLE.
schema_name
Název schématu, do kterého nová tabulka patří.
table_name
Název nové tabulky. Názvy tabulek musí dodržovat pravidla pro identifikátory .
table_name může být maximálně 128 znaků, s výjimkou místních dočasných názvů tabulek (názvy s předponou jedno znaménko# ()), které nesmí překročit 116 znaků.
AS FileTable
platí pro: SQL Server 2012 (11.x) a novější verze.
Vytvoří novou tabulku jako FileTable. Nezadáváte sloupce, protože FileTable má pevné schéma. Další informace naleznete v tématu FileTables.
column_nameCOMPUTED_COLUMN_EXPRESSION AS
Výraz, který definuje hodnotu počítaného sloupce. Počítaný sloupec je virtuální sloupec, který není fyzicky uložený v tabulce, pokud není sloupec označený JAKO TRVALÝ. Sloupec se vypočítá z výrazu, který používá jiné sloupce ve stejné tabulce. Počítaný sloupec může mít například definici: cost AS price * qty. Výrazem může být nespočítaný název sloupce, konstanta, funkce, proměnná a libovolná kombinace těchto operátorů spojených jedním nebo více operátory. Výraz nemůže být poddotaz nebo obsahovat datové typy aliasů.
Počítané sloupce se dají použít ve vybraných seznamech, klauzulích WHERE, klauzulích ORDER BY nebo jiných umístěních, ve kterých se dají regulární výrazy použít, s následujícími výjimkami:
Počítané sloupce musí být označené PERSISTED, aby se účastnily omezení CIZÍ KLÍČ nebo CHECK.
Počítaný sloupec lze použít jako klíčový sloupec v indexu nebo jako součást jakéhokoli omezení PRIMARY KEY nebo UNIQUE, pokud je vypočítaná hodnota sloupce definovaná deterministickým výrazem a datový typ výsledku je povolený ve sloupcích indexu.
Pokud má například tabulka celočíselné sloupce
aabpočítaný sloupeca + bmůže být indexovaný, ale vypočítaný sloupeca + DATEPART(dd, GETDATE())se nedá indexovat, protože hodnota se může při následných vyvolání změnit.Počítaný sloupec nemůže být cílem příkazu INSERT nebo UPDATE.
Note
Každý řádek v tabulce může mít různé hodnoty pro sloupce, které jsou zapojeny do počítaného sloupce; Proto vypočítaný sloupec nemusí mít pro každý řádek stejnou hodnotu.
Na základě použitých výrazů určuje databázový stroj možnost null vypočítaných sloupců automaticky. Výsledek většiny výrazů je považován za nulový, i když jsou přítomny pouze nenulovatelné sloupce, protože možné podtečení nebo přetečení také vytváří výsledky NULL.
COLUMNPROPERTY Pomocí funkce s Vlastnost AllowsNull můžete prozkoumat nullability libovolného počítaného sloupce v tabulce. Výraz, který je nullable lze převést na nenulable jeden zadáním ISNULLcheck_expression konstanty, kde konstanta je nenulová hodnota nahrazena pro jakýkoli výsledek NULL. Pro počítané sloupce založené na uživatelsky definovaných výrazech clr (Common Language Runtime) se vyžaduje oprávnění REFERENCE k typu.
PERSISTED
Specifikuje, že SQL Server Database Engine fyzicky ukládá vypočtené hodnoty do tabulky a aktualizuje je, když jsou aktualizovány další sloupce, na kterých závisí vypočítaný sloupec. Označení počítaného sloupce jako PERSISTED umožňuje vytvořit index vypočítaného sloupce, který je deterministický, ale není přesný. Další informace najdete v tématu Indexy ve vypočítaných sloupcích. Všechny počítané sloupce, které se používají jako dělení sloupců dělené tabulky, musí být explicitně označeny PERSISTED.
computed_column_expression musí být při zadání deterministický PERSISTED .
ON { partition_scheme | filegroup | "výchozí" }
Určuje schéma oddílů nebo skupinu souborů, na které je tabulka uložena. Pokud je zadán partition_scheme , tabulka je dělenou tabulkou, jejíž oddíly jsou uloženy v sadě jedné nebo více skupin souborů zadaných v partition_scheme. Pokud je zadána skupina souborů , tabulka je uložena v pojmenované skupině souborů. Skupina souborů musí existovat v databázi. Pokud "default" je zadána nebo pokud není zapnuto vůbec, je tabulka uložena ve výchozí skupině souborů. Mechanismus úložiště tabulky, jak je uvedeno v příkazu CREATE TABLE, nelze následně změnit.
ON { partition_scheme | filegroup | "default" } lze také zadat v omezení PRIMÁRNÍ KLÍČ nebo UNIQUE. Tato omezení vytvářejí indexy. Pokud je zadána skupina souborů , index se uloží do pojmenované skupiny souborů. Pokud "default" je zadán nebo pokud není zapnuto vůbec, index se uloží ve stejné skupině souborů jako tabulka. Pokud omezení PRIMARY KEY nebo UNIQUE vytvoří clusterovaný index, datové stránky tabulky se uloží do stejné skupiny souborů jako index. Pokud CLUSTERED je specifikováno nebo jinak omezení vytváří shlukovaný index a je specifikován partition_scheme , který se liší od partition_scheme nebo souborové skupiny definice tabulky, nebo naopak, respektuje se pouze definice omezení, zatímco druhá je ignorována.
Note
V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v ON "default" nebo ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.
Po vytvoření dělené tabulky zvažte nastavení LOCK_ESCALATION možnosti tabulky na AUTO. To může zlepšit souběžnost tím, že povolí zámky, aby se místo tabulky eskalovala na úroveň oddílu (HoBT). Další informace naleznete v tématu ALTER TABLE.
TEXTIMAGE_ON { filegroup | "výchozí" }
Označuje, že text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) a sloupce typu definované uživatelem CLR (včetně geometrie a geografie) jsou uloženy v zadané skupině souborů.
TEXTIMAGE_ON není povolená, pokud v tabulce nejsou žádné sloupce s velkými hodnotami.
TEXTIMAGE_ON Nelze zadat, pokud je zadán partition_scheme . Pokud "default" je zadána nebo pokud TEXTIMAGE_ON není vůbec zadána, velké sloupce hodnot jsou uloženy ve výchozí skupině souborů. Úložiště dat sloupce s velkými hodnotami zadaných v CREATE TABLE tomto sloupci nelze následně změnit.
Note
varchar(max), nvarchar(max), varbinary(max), xml a velké hodnoty UDT se ukládají přímo v datovém řádku, až do limitu 8 000 bajtů a pokud se hodnota může přizpůsobit záznamu. Pokud hodnota do záznamu nepasuje, ukazatel se uloží do řádku a zbytek je uložen mimo řádek v LOB úložném prostoru. 0 je výchozí hodnota, která označuje, že všechny hodnoty jsou uloženy přímo v datovém řádku.
TEXTIMAGE_ON mění pouze umístění "LOB storage space", neovlivňuje, kdy jsou data uložena v řádku. Pokud chcete uložit celou obchodní hodnotu mimo řádek, použijte velké typy hodnot mimo řádek sp_tableoption .
V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v TEXTIMAGE_ON "default" nebo TEXTIMAGE_ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.
FILESTREAM_ON { partition_scheme_name | Filegroup | "výchozí" }
Platí na: SQL Server 2008 R2 (10.50.x) a pozdější verze. Azure SQL Database a Azure SQL Managed Instance nepodporují FILESTREAM.
Určuje skupinu souborů pro data FILESTREAM.
Pokud tabulka obsahuje data FILESTREAM a tabulka je rozdělena, musí být zahrnuta klauzule FILESTREAM_ON a musí zadat schéma oddílů filegroups FILESTREAM. Toto schéma oddílů musí používat stejnou funkci oddílu a sloupce oddílů jako schéma oddílů tabulky; v opačném případě se vyvolá chyba.
Pokud tabulka není rozdělená na oddíly, sloupec FILESTREAM nemůže být rozdělený na oddíly. Data FILESTREAM pro tabulku musí být uložena v jedné skupině souborů. Tato skupina souborů je zadána v klauzuli FILESTREAM_ON.
Pokud tabulka není rozdělená do oddílů a FILESTREAM_ON klauzule není zadaná, použije se skupina souborů FILESTREAM, která má nastavenou DEFAULT vlastnost. Pokud není souborová skupina FILESTREAM, zobrazí se chyba.
Stejně jako u funkce ZAPNUTa a TEXTIMAGE_ONhodnota nastavená pomocí příkazu CREATE TABLE for FILESTREAM_ON se nedá změnit, s výjimkou následujících případů:
- Příkaz CREATE INDEX převede haldu na clusterovaný index. V tomto případě je možné zadat jinou skupinu souborů FILESTREAM, schéma oddílů nebo hodnotu NULL.
- Příkaz DROP INDEX převede clusterovaný index na haldu. V tomto případě je možné zadat jinou skupinu souborů FILESTREAM, schéma oddílů nebo
"default"lze zadat.
Skupina souborů v FILESTREAM_ON <filegroup> klauzuli nebo každá skupina souborů FILESTREAM, která je pojmenovaná v schématu oddílů, musí mít definovaný jeden soubor pro skupinu souborů. Tento soubor musí být definován pomocí příkazu CREATE DATABASE nebo ALTER DATABASE ; v opačném případě se vyvolá chyba.
Pro související články o FILESTREAM viz Binární velká objektová (Blob) Data.
[ type_schema_name. ] type_name
Určuje datový typ sloupce a schéma, do kterého patří. Pro diskové tabulky použijte jeden z následujících datových typů:
- Systémový datový typ
- Typ aliasu založený na systémovém datovém typu SQL Serveru. Datové typy aliasů se vytvoří pomocí
CREATE TYPEpříkazu, než je lze použít v definici tabulky. Přiřazení NULL nebo NOT NULL pro datový typ aliasu lze běhemCREATE TABLEpříkazu přepsat. Specifikace délky však nelze změnit; v příkazu nelze zadat délku datového typu aliasuCREATE TABLE. - Uživatelem definovaný typ CLR. Uživatelem definované typy CLR se vytvářejí pomocí
CREATE TYPEpříkazu, než je lze použít v definici tabulky. K vytvoření sloupce u uživatelem definovaného typu CLR se u typu vyžaduje oprávnění REFERENCES.
Pokud type_schema_name nezadáte, databázový stroj SQL Serveru odkazuje type_name v následujícím pořadí:
- Systémový datový typ SYSTÉMU SQL Server.
- Výchozí schéma aktuálního uživatele v aktuální databázi.
- Schéma
dbov aktuální databázi.
Pro tabulky optimalizované pro paměť viz Podporované datové typy pro In-Memory OLTP pro seznam podporovaných systémových typů.
precision
Přesnost zadaného datového typu. Další informace o platnýchhodnotách
scale
Měřítko pro zadaný datový typ. Další informace o platných hodnotách měřítka naleznete v tématu Přesnost, měřítko a délka.
max
Platí pouze pro datové typy varchar, nvarchar a varbinary pro ukládání 2^31 bajtů znaků a binárních dat a 2^30 bajtů dat Unicode.
CONTENT
Určuje, že každá instance datového typu XML v column_name může obsahovat více prvků nejvyšší úrovně. CONTENT se vztahuje pouze na datový typ XML a lze jej zadat pouze v případě , že je zadán také xml_schema_collection. Pokud není zadaný, je výchozí chování CONTENT.
DOCUMENT
Určuje, že každá instance datového typu XML v column_name může obsahovat pouze jeden prvek nejvyšší úrovně. DOCUMENT se vztahuje pouze na datový typ XML a lze jej zadat pouze v případě , že je zadán také xml_schema_collection.
xml_schema_collection
Platí pouze pro datový typ XML pro přidružení kolekce schématu XML k typu. Před zadáním sloupce XML do schématu musí být schéma nejprve vytvořeno v databázi pomocí CREATE XML SCHEMA COLLECTION.
DEFAULT
Určuje hodnotu zadanou pro sloupec, pokud hodnota není explicitně zadána během vložení. Výchozí definice lze použít u všech sloupců s výjimkou těch, které jsou definovány jako časové razítko nebo definice s IDENTITY vlastností. Pokud je pro sloupec typu definované uživatelem zadaná výchozí hodnota, měl by tento typ podporovat implicitní převod z constant_expression na uživatelem definovaný typ. Při vyřazení tabulky se odeberou výchozí definice. Pouze konstantní hodnota, například řetězec znaků; skalární funkce (systém, uživatelem definovaná nebo funkce CLR); nebo NULL lze použít jako výchozí. Chcete-li zachovat kompatibilitu se staršími verzemi SQL Serveru, je možné přiřadit název omezení k výchozímu nastavení.
constant_expression
Konstanta, NULL nebo systémová funkce, která se používá jako výchozí hodnota sloupce.
memory_optimized_constant_expression
Konstanta, NULL nebo systémová funkce, která je podporována jako výchozí hodnota sloupce. Musí být podporován v nativně zkompilovaných uložených procedurách. Další informace o předdefinovaných funkcích v nativně zkompilovaných uložených procedurách naleznete v tématu Podporované funkce pro nativně kompilované moduly T-SQL.
IDENTITY
Označuje, že nový sloupec je sloupec identity. Když do tabulky přidáte nový řádek, databázový stroj poskytuje jedinečnou přírůstkovou hodnotu sloupce. Sloupce identity se obvykle používají s omezeními PRIMÁRNÍHO KLÍČE, které slouží jako jedinečný identifikátor řádku tabulky. Vlastnost IDENTITY lze přiřadit ke sloupcům tinyint, smallint, int, bigint, decimal(p, 0) nebo numeric(p, 0). Pro každou tabulku je možné vytvořit pouze jeden sloupec identity. Vázané výchozí hodnoty a výchozí omezení nelze použít se sloupcem identity. Musí být zadáno počáteční i přírůstkové nebo ani jedno. Pokud není zadán žádný z nich, výchozí hodnota je (1,1).
seed
Hodnota použitá pro první řádek načtený do tabulky.
increment
Přírůstková hodnota přidaná k hodnotě identity předchozího načteného řádku.
NE PRO REPLIKACI
CREATE TABLE V příkazu lze klauzuli NOT FOR REPLICATION zadat pro vlastnost IDENTITY, omezení cizího klíče a omezení CHECK. Pokud je pro IDENTITY vlastnost zadaná tato klauzule, hodnoty se při vkládání agentů replikace nevýkoní ve sloupcích identit. Pokud je tato klauzule zadaná pro omezení, omezení se nevynucuje, když agenti replikace provádějí operace vložení, aktualizace nebo odstranění.
VYGENEROVÁNO VŽDY JAKO { ŘÁDEK | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ SKRYTÉ ] [ NOT NULL ]
Platí na: SQL Server 2016 (13.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje sloupec používaný systémem k automatickému záznamu informací o verzích řádků v tabulce a její tabulce historie (pokud je tabulka systémová verze a obsahuje tabulku historie). Tento argument s parametrem WITH SYSTEM_VERSIONING = ON použijte k vytvoření tabulek se systémovou verzí: dočasné tabulky nebo tabulky registru. Další informace najdete v aktualizovatelných tabulkách registru a dočasných tabulkách.
| Parameter | Požadovaný datový typ | Požadovaná nulovatelnost | Description |
|---|---|---|---|
| ROW | datetime2 | ZAČÍNAT: NOT NULLKONEC: NOT NULL |
Buď počáteční čas, pro který je verze řádku platná (START), nebo koncový čas, pro který je verze řádku platná (END). Tento argument s argumentem PERIOD FOR SYSTEM_TIME použijte k vytvoření dočasné tabulky. |
| TRANSACTION_ID | bigint | ZAČÍNAT: NOT NULLKONEC: NULL |
Platí na: SQL Server 2022 (16.x) a novější verze, a Azure SQL Database. ID transakce, která vytvoří (START) nebo zneplatní (END) verzi řádku. Pokud je tabulka hlavní knihy, ID odkazuje na řádek v zobrazení sys.database_ledger_transactions . |
| SEQUENCE_NUMBER | bigint | ZAČÍNAT: NOT NULLKONEC: NULL |
Platí na: SQL Server 2022 (16.x) a novější verze, a Azure SQL Database. Pořadové číslo operace, která vytvoří (START) nebo odstraní (END) verzi řádku. Tato hodnota je v rámci transakce jedinečná. |
Pokud se pokusíte specifikovat sloupec, který nesplňuje tyto požadavky na typ dat nebo neplatnost, systém vyhodí chybu. Pokud explicitně nespecifikujete nulovatelnost, systém definuje sloupec podle NULLNOT NULL uvedených požadavků.
Jedním nebo oběma sloupci období můžete označit příznakem HIDDEN , aby se tyto sloupce implicitně skrývaly tak, aby SELECT * FROM <table> nevrací hodnotu těchto sloupců. Ve výchozím nastavení nejsou sloupce období skryté. Aby bylo možné je použít, musí být skryté sloupce explicitně zahrnuty do všech dotazů, které přímo odkazují na dočasnou tabulku. Chcete-li změnit HIDDEN atribut existujícího sloupce období, PERIOD je nutné vynechat a znovu vytvořit s jiným skrytým příznakem.
INDEX index_name [ SHLUK | NECLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Určuje vytvoření indexu v tabulce. Může se jednat o clusterovaný index nebo neclusterovaný index. Index obsahuje sloupce uvedené a seřadí data vzestupně nebo sestupně.
INDEX INDEX_NAME CLUSTERED COLUMNSTORE
Platí pro: SQL Server 2014 (12.x) a novější verze a Azure SQL Database.
Určuje uložení celé tabulky ve sloupcovém formátu s clusterovaným indexem columnstore. To vždy zahrnuje všechny sloupce v tabulce. Data nejsou seřazená v abecedním nebo číselném pořadí, protože řádky jsou uspořádané tak, aby získaly výhody komprese columnstore.
Můžete zadat pořadí dat v clusterovaném indexu columnstore počínaje SQL Serverem 2022 (16.x), v Azure SQL Database, v Azure SQL Managed InstanceAUTD a v Azure Synapse Analytics. Další informace najdete v sekci Ladění výkonu se seřazenými indexy typu columnstore.
INDEX index_name [ NE-SHLUKOVANÝ ] COLUMNSTORE ( column_name [ ,... n ] )
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje vytvoření neclusterovaného indexu columnstore v tabulce. Podkladovou tabulkou může být halda úložiště řádků nebo clusterovaný index nebo clusterovaný index columnstore. Ve všech případech se při vytváření neclusterovaného indexu columnstore v tabulce uloží druhá kopie dat pro sloupce v indexu.
Neclusterovaný index columnstore se ukládá a spravuje jako clusterovaný index columnstore. Říká se tomu index neclusterovaného columnstore , protože sloupce mohou být omezené a existuje jako sekundární index v tabulce.
Můžete zadat pořadí dat v neclusterovaném indexu columnstore ve službě Azure SQL Database a ve službě Azure SQL Managed InstanceAUTD. Další informace najdete v sekci Ladění výkonu se seřazenými indexy typu columnstore.
Na partition_scheme_name ( column_name )
Specifikuje schéma rozdělení, které definuje skupiny souborů, na které jsou rozdělené oddíly indexu mapovány. Schéma oddílů musí existovat v databázi spuštěním příkazu CREATE PARTITION SCHEME nebo ALTER PARTITION SCHEME. column_name určuje sloupec, podle kterého je dělený index rozdělený. Tento sloupec musí odpovídat datovému typu, délce a přesnosti argumentu funkce oddílu, který partition_scheme_name používá. column_name nejsou omezeny na sloupce v definici indexu. Můžete zadat libovolný sloupec v základní tabulce s výjimkou dělení indexu UNIQUE, column_name je nutné vybrat z nich, které se používají jako jedinečný klíč. Toto omezení umožňuje databázovému stroji ověřit jedinečnost hodnot klíčů pouze v rámci jednoho oddílu.
Note
Když rozdělíte neunikátní, shlukovaný index, databázový engine ve výchozím nastavení přidá sloupec rozdělení do seznamu klíčů shlukovaných indexů, pokud není již specifikován. Při dělení ne-unikátního, neshlukovaného indexu databázový engine přidá sloupec pro rozdělení jako sloupec indexu bez klíče (zahrnutý), pokud není již specifikován.
Pokud partition_scheme_name nebo skupinu souborů nezadáte a tabulka se rozdělí, index se umístí do stejného schématu oddílů pomocí stejného sloupce dělení jako podkladová tabulka.
Note
Na XML indexu nelze specifikovat schéma rozdělení. Pokud je základní tabulka rozdělená na oddíly, index XML používá stejné schéma oddílů jako tabulka.
Další informace o dělení indexů, dělených tabulek a indexů.
ZAPNUTO filegroup_name
Vytvoří zadaný index pro zadanou skupinu souborů. Pokud není zadáno žádné umístění a tabulka nebo zobrazení nejsou rozdělené na oddíly, index použije stejnou skupinu souborů jako podkladová tabulka nebo zobrazení. Skupina souborů už musí existovat.
ZAPNUTO "výchozí"
Vytvoří zadaný index ve výchozí skupině souborů.
Note
V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v ON "default" nebo ON [default]. Pokud "default" je tato možnost zadaná, QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá. Toto je výchozí nastavení. Další informace naleznete v tématu SET QUOTED_IDENTIFIER.
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
Platí na: SQL Server 2008 R2 (10.50.x) a pozdější verze.
Určuje umístění dat FILESTREAM pro tabulku při vytvoření clusterovaného indexu. Klauzule FILESTREAM_ON umožňuje přesunutí dat FILESTREAM do jiného schématu filegroup nebo oddílu FILESTREAM.
filestream_filegroup_name je název filegroup FILESTREAM. Skupina souborů musí mít jeden soubor definovaný pro skupinu souborů pomocí příkazu CREATE DATABASE nebo ALTER DATABASE; v opačném případě se vyvolá chyba.
Pokud je tabulka rozdělená na oddíly, FILESTREAM_ON musí být zahrnuta klauzule a musí zadat schéma oddílů filegroups FILESTREAM, které používá stejnou funkci oddílu a sloupce oddílů jako schéma oddílů tabulky. V opačném případě se vyvolá chyba.
Pokud tabulka není rozdělená na oddíly, sloupec FILESTREAM nemůže být rozdělený na oddíly. Data FILESTREAM pro tabulku musí být uložena v jedné skupině souborů, která je zadána v klauzuli FILESTREAM_ON.
FILESTREAM_ON NULL lze zadat v příkazu CREATE INDEX, pokud se vytváří clusterovaný index a tabulka neobsahuje sloupec FILESTREAM.
Další informace naleznete v tématu FILESTREAM.
ROWGUIDCOL
Označuje, že nový sloupec je sloupec GUID řádku. Jako sloupec ROWGUIDCOL lze určit pouze jeden sloupec uniqueidentifier na tabulku. Použití vlastnosti ROWGUIDCOL umožňuje, aby se na sloupec odkazoval pomocí $ROWGUID. Vlastnost ROWGUIDCOL lze přiřadit pouze ke sloupci uniqueidentifier . Sloupce datového typu definované uživatelem nelze určit pomocí ROWGUIDCOL.
Vlastnost ROWGUIDCOL nevynucuje jedinečnost hodnot uložených ve sloupci. ROWGUIDCOL také automaticky negeneruje hodnoty pro nové řádky vložené do tabulky. Pokud chcete vygenerovat jedinečné hodnoty pro každý sloupec, použijte funkci NEWID nebo NEWSEQUENTIALID u příkazů INSERT nebo použijte tyto funkce jako výchozí pro sloupec.
ZAŠIFROVANÉ S
Určuje šifrování sloupců pomocí funkce Always Encrypted .
COLUMN_ENCRYPTION_KEY = key_name
Určuje šifrovací klíč sloupce. Další informace naleznete v tématu CREATE COLUMN ENCRYPTION KEY.
ENCRYPTION_TYPE = { DETERMINISTIC | NÁHODNÉ }
Deterministické šifrování používá metodu, která vždy generuje stejnou zašifrovanou hodnotu pro libovolnou danou hodnotu prostého textu. Použití deterministického šifrování umožňuje vyhledávání pomocí porovnání rovnosti, seskupování a spojování tabulek pomocí spojení rovnosti na základě šifrovaných hodnot, ale může také umožnit neoprávněným uživatelům odhadnout informace o šifrovaných hodnotách prozkoumáním vzorů v šifrovaném sloupci. Spojení dvou tabulek se sloupci šifrovanými deterministicky je možné pouze v případě, že jsou oba sloupce šifrované pomocí stejného šifrovacího klíče sloupce. Deterministické šifrování musí pro sloupce znaků použít sloupcovou kolaci s pořadím řazení binary2.
randomizované šifrování používá metodu, která šifruje data méně předvídatelným způsobem. Randomizované šifrování je bezpečnější, ale brání jakýmkoli výpočtům a indexování u šifrovaných sloupců, pokud instance SQL Serveru nepodporuje funkci Always Encrypted se zabezpečenými enklávy. Podrobnosti naleznete v části Always Encrypted se zabezpečenou enklávou.
Pokud používáte Always Encrypted (bez zabezpečených enkláv), použijte deterministické šifrování pro sloupce, které jsou prohledávány pomocí parametrů nebo parametrů seskupování, například vládního identifikačního čísla. Použijte randomizované šifrování dat, jako je číslo platební karty, které není seskupené s jinými záznamy nebo slouží ke spojení tabulek a které se nehledají, protože k vyhledání řádku obsahujícího šifrovaný sloupec zájmu použijete jiné sloupce (například číslo transakce).
Pokud používáte Always Encrypted se zabezpečenými enklávami, doporučuje se náhodné šifrování.
Sloupce musí být opravňujícím datovým typem.
ALGORITHM
Platí pro: SQL Server 2016 (13.x) a novější verze.
Musí být
'AEAD_AES_256_CBC_HMAC_SHA_256'.Další informace včetně omezení funkcí najdete v tématu Funkce Always Encrypted.
SPARSE
Označuje, že sloupec je řídký sloupec. Úložiště řídkých sloupců je optimalizované pro hodnoty null. Řídké sloupce nelze označit jako NOT NULL. Další omezení a další informace o řídkých sloupcích najdete v tématu Použití řídkých sloupců.
MASKOVÁNO ( FUNKCE = 'mask_function' )
Platí pro: SQL Server 2016 (13.x) a novější verze.
Určuje dynamickou masku dat. mask_function je název funkce maskování s příslušnými parametry. K dispozici jsou čtyři funkce:
default()email()partial()random()
Vyžaduje oprávnění ALTER ANY MASK.
Parametry funkce najdete v tématu Dynamické maskování dat.
FILESTREAM
Platí na: SQL Server 2008 R2 (10.50.x) a pozdější verze.
Platné pouze pro sloupce varbinary(max). Určuje úložiště FILESTREAM pro data objektu blob varbinary(max ).
Tabulka musí mít také sloupec datového typu uniqueidentifier , který má atribut ROWGUIDCOL. Tento sloupec nesmí povolit hodnoty null a musí mít omezení JEDINEČNÉ nebo PRIMÁRNÍ KLÍČ s jedním sloupcem. Hodnota GUID pro sloupec musí být zadána aplikací při vkládání dat, nebo ve výchozím omezení, které používá funkci NEWID ().
Sloupec ROWGUIDCOL nelze vynechat a související omezení nelze měnit, dokud je pro tabuli definován sloupec FILESTREAM. Sloupec ROWGUIDCOL lze vynechat až po vyřazení posledního sloupce FILESTREAM.
Pokud je pro sloupec zadaný atribut úložiště FILESTREAM, všechny hodnoty pro tento sloupec jsou uloženy v kontejneru dat FILESTREAM v systému souborů.
COLLATION_NAME COLLATE
Určuje kolaci sloupce. Název kolace může být buď název kolace Systému Windows, nebo název kolace SQL. collation_name platí jenom pro sloupce znaku, varcharu, textu, ncharu, nvarcharu a ntextových datových typů. Pokud není zadaný, je sloupec přiřazen buď kolaci uživatelem definovaného datového typu, pokud je sloupec uživatelem definovaný datový typ, nebo výchozí kolace databáze.
Pro více informací o názvech kolace Windows a SQL viz Windows collation name a SQL Server Collation Name.
Další informace naleznete v tématu COLLATE.
CONSTRAINT
Volitelné klíčové slovo, které označuje začátek definice PRIMÁRNÍHO KLÍČE, NOT NULL, UNIQUE, CIZÍ KLÍČ nebo CHECK omezení.
constraint_name
Název omezení. Názvy omezení musí být jedinečné v rámci schématu, do kterého tabulka patří.
NULL | NE NULL
Určete, zda jsou ve sloupci povoleny hodnoty null. NULL není výhradně omezení, ale dá se zadat stejně jako NOT NULL. HODNOTU NOT NULL lze zadat pro počítané sloupce pouze v případě, že je zadána funkce PERSISTED.
PRIMÁRNÍ KLÍČ
Omezení, které vynucuje integritu entity pro zadaný sloupec nebo sloupce prostřednictvím jedinečného indexu. Pro každou tabulku lze vytvořit pouze jedno omezení PRIMÁRNÍHO KLÍČE.
UNIQUE
Omezení, které poskytuje integritu entity pro zadaný sloupec nebo sloupce prostřednictvím jedinečného indexu. Tabulka může mít několik omezení UNIQUE.
CLUSTERED | NECLUSTERED
Označuje, že clusterovaný nebo neclusterovaný index je vytvořen pro omezení PRIMÁRNÍ KLÍČ nebo UNIQUE. Omezení PRIMÁRNÍHO KLÍČE jsou výchozí pro CLUSTERED a jedinečná omezení výchozí pro NONCLUSTERED.
CREATE TABLEV příkazu lze clusterED zadat pouze pro jedno omezení. Pokud je pro omezení UNIQUE zadáno clusterED a je zadáno omezení PRIMÁRNÍHO KLÍČE, primární klíč je výchozí hodnota NONCLUSTERED.ODKAZY NA CIZÍ KLÍČ
Omezení, které poskytuje referenční integritu dat ve sloupci nebo sloupcích. Omezení CIZÍHO KLÍČE vyžadují, aby každá hodnota ve sloupci existovala v odpovídajícím odkazovaném sloupci nebo sloupcích v odkazované tabulce. Omezení CIZÍHO KLÍČE můžou odkazovat pouze na sloupce, které jsou omezení PRIMARY KEY nebo UNIQUE v odkazované tabulce nebo sloupcích odkazovaných v indexu UNIQUE v odkazované tabulce. Cizí klíče ve vypočítaných sloupcích musí být také označeny JAKO TRVALÉ.
[ [ schema_name. ] referenced_table_name ]
Název tabulky odkazované omezením CIZÍ KLÍČ a schéma, do kterého patří.
( ref_column [ ,... n ] )
Sloupec nebo seznam sloupců z tabulky odkazované omezením CIZÍ KLÍČ.
PŘI ODSTRANĚNÍ { ŽÁDNÁ AKCE | CASCADE | NASTAVIT HODNOTU NULL | NASTAVIT VÝCHOZÍ }
Určuje, co se akce stane s řádky v tabulce vytvořené, pokud tyto řádky mají referenční relaci a odkazovaný řádek se odstraní z nadřazené tabulky. Výchozí hodnota není ŽÁDNÁ AKCE.
ŽÁDNÁ AKCE
Databázový stroj vyvolá chybu a akce odstranění na řádku v nadřazené tabulce se vrátí zpět.
CASCADE
Odpovídající řádky se odstraní z odkazující tabulky, pokud je tento řádek odstraněn z nadřazené tabulky.
SET NULL
Všechny hodnoty, které tvoří cizí klíč, jsou nastaveny na hodnotu NULL, pokud je odstraněn odpovídající řádek v nadřazené tabulce. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.
NASTAVTE VÝCHOZÍ NASTAVENÍ
Při odstranění odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec nullable a není zde explicitní výchozí hodnota, NULL se stává implicitní výchozí hodnotou sloupce.
Neuvádějte
CASCADE, jestli tabulku zahrnete do publikace při sloučení, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.ON DELETE CASCADENelze definovat, pokudINSTEAD OFaktivační událostON DELETEjiž v tabulce existuje.Například v
AdventureWorks2025databáziProductVendormá tabulka referenční relaci s tabulkouVendor. CizíProductVendor.BusinessEntityIDklíč odkazuje naVendor.BusinessEntityIDprimární klíč.Pokud je
DELETEpříkaz proveden na řádku vVendortabulce aON DELETE CASCADEakce je určena proProductVendor.BusinessEntityID, databázový stroj zkontroluje jeden nebo více závislých řádků vProductVendortabulce. Pokud nějaké existují, odstraní se závislé řádky vProductVendortabulce a také řádek odkazovaný vVendortabulce.Naopak, pokud
NO ACTIONje specifikováno, databázový engine vyhlásí chybu a vrátí zpět akciVendorsmazání řádku, pokud je v tabulceProductVendoralespoň jeden řádek, který na něj odkazuje.ON UPDATE { NO ACTION | CASCADE | NASTAVIT HODNOTU NULL | NASTAVIT VÝCHOZÍ }
Určuje, co se stane s řádky v tabulce změněné, když tyto řádky mají referenční relaci a odkazovaný řádek se aktualizuje v nadřazené tabulce. Výchozí hodnota není ŽÁDNÁ AKCE.
ŽÁDNÁ AKCE
Databázový stroj vyvolá chybu a akce aktualizace na řádku v nadřazené tabulce se vrátí zpět.
CASCADE
Odpovídající řádky se aktualizují v odkazující tabulce, když se tento řádek aktualizuje v nadřazené tabulce.
SET NULL
Při aktualizaci odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na hodnotu NULL. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.
NASTAVTE VÝCHOZÍ NASTAVENÍ
Při aktualizaci odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec nullable a není zde explicitní výchozí hodnota, NULL se stává implicitní výchozí hodnotou sloupce.
Neuvádějte
CASCADE, jestli tabulku zahrnete do publikace při sloučení, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.ON UPDATE CASCADE,SET NULLneboSET DEFAULTnelze definovat, pokudINSTEAD OFtriggerON UPDATEjiž existuje v tabulce, která se mění.Například v
AdventureWorks2025databáziProductVendormá tabulka referenční relaci sVendortabulkou:ProductVendor.BusinessEntitycizí klíč odkazuje naVendor.BusinessEntityIDprimární klíč.Pokud je příkaz UPDATE proveden na řádku v
Vendortabulce a je zadána akce ON UPDATE CASCADE proProductVendor.BusinessEntityID, databázový stroj kontroluje jeden nebo více závislých řádků vProductVendortabulce. Pokud nějaké existují, aktualizují se závislé řádky vProductVendortabulce a také řádek odkazovaný vVendortabulce.Naopak, pokud není specifikována ŽÁDNÁ AKCE, databázový engine vyvolá chybu a vrátí aktualizační akci v řádku
Vendor, pokud je v tabulceProductVendoralespoň jeden řádek, který na ni odkazuje.CHECK
Omezení, které vynucuje integritu domény omezením možných hodnot, které lze zadat do sloupce nebo sloupců. Omezení CHECK u počítaných sloupců musí být označená také jako TRVALÁ.
logical_expression
Logický výraz, který vrací hodnotu PRAVDA nebo NEPRAVDA. Datové typy aliasů nemůžou být součástí výrazu.
column_name
Sloupec nebo seznam sloupců v závorkách, které se používají v omezeních tabulky k označení sloupců použitých v definici omezení
[ ASC | POPIS ]
Určuje pořadí řazení sloupců nebo sloupců, které se účastní omezení tabulky. Výchozí hodnota je ASC.
partition_scheme_name
Název schématu rozdělení, které definuje skupiny souborů, na které jsou rozdělené tabulky mapovány. Schéma oddílů musí existovat v databázi.
[ partition_column_name. ]
Specifikuje sloupec, proti kterému je rozdělená tabulka rozdělena. Sloupec se musí shodovat s funkcí oddílu, která partition_scheme_name používá z hlediska datového typu, délky a přesnosti. Počítaný sloupec, který se účastní funkce oddílu, musí být explicitně označen jako PERSISTED.
Important
Doporučujeme zadat HODNOTU NOT NULL ve sloupci dělení dělených tabulek a také tabulky, které nejsou rozdělené do oddílů, které jsou zdroji nebo cíli ALTER TABLE... OPERACE SWITCH. Tímto způsobem zajistíte, že jakákoli CHECK omezení na dělení sloupců nemusí kontrolovat nulové hodnoty.
S FILLFACTOR = FILLFACTOR = fillfactor
Určuje, jak by měl databázový stroj zaplnit každou indexovou stránku, která se používá k ukládání dat indexu. Uživatelem zadané hodnoty fillfactor mohou být od 1 do 100. Pokud není zadaná hodnota, výchozí hodnota je 0. Hodnoty výplňového faktoru 0 a 100 jsou ve všech ohledech stejné.
Important
Dokumentace S FILLFACTOR = fillfactor jako jedinou indexovou možností, která se vztahuje na omezení PRIMÁRNÍ KLÍČ nebo UNIQUE, je zachována pro zpětnou kompatibilitu, ale v budoucích vydáních takto dokumentována není.
column_set_name COLUMN_SET XML PRO ALL_SPARSE_COLUMNS
Název sady sloupců. Sada sloupců je netypová reprezentace XML, která kombinuje všechny řídké sloupce tabulky do strukturovaného výstupu. Další informace o sadách sloupců najdete v tématu Použití sad sloupců.
OBDOBÍ PRO SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Specifikuje názvy sloupců, které systém používá k zaznamenání období, za které je záznam platný. Tento argument použijte s GENERATED ALWAYS AS ROW { START | END } argumenty a WITH SYSTEM_VERSIONING = ON vytvořte dočasnou tabulku. Další informace naleznete v tématu časové tabulky.
COMPRESSION_DELAY
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Pro paměťově optimalizované zařízení zpoždění určuje minimální počet minut, během kterých musí řádek zůstat v tabulce beze změny, než je způsobilý ke kompresi do indexu columnstore. SQL Server vybere konkrétní řádky, které se mají komprimovat podle času poslední aktualizace. Pokud se například řádky často mění během dvouhodinového časového období, můžete nastavit COMPRESSION_DELAY = 120 Minutes , aby se aktualizace dokončily před komprimacemi řádku SQL Serverem.
U tabulky založené na disku určuje zpoždění minimální počet minut, po které musí rozdílová skupina řádků ve stavu CLOSED zůstat v rozdílové skupině řádků, aby ho SQL Server mohl zkomprimovat do komprimované skupiny řádků. Vzhledem k tomu, že tabulky založené na disku nesledují časy vkládání a aktualizace jednotlivých řádků, SQL Server použije zpoždění u rozdílových skupin řádků ve stavu CLOSED.
Výchozí hodnota je 0 minut.
Pro doporučení, kdy používat COMPRESSION_DELAY, viz Začněte s indexy columnstore pro provozní analytiku v reálném čase
< > table_option ::=
Určuje jednu nebo více možností tabulky.
DATA_COMPRESSION
Určuje možnost komprese dat pro zadanou tabulku, číslo oddílu nebo rozsah oddílů. Možnosti jsou následující:
NONE
Tabulky nebo zadané oddíly nejsou komprimované.
ROW
Tabulky nebo zadané oddíly se komprimují pomocí komprese řádků.
PAGE
Tabulky nebo zadané oddíly se komprimují pomocí komprese stránky.
COLUMNSTORE
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Platí pouze pro indexy columnstore, včetně neclusterovaných indexů columnstore i clusterovaných indexů columnstore. COLUMNSTORE určuje komprimaci s nejvýkonnější kompresí columnstore. Toto je typická volba.
COLUMNSTORE_ARCHIVE
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Platí pouze pro indexy columnstore, včetně neclusterovaných indexů columnstore i clusterovaných indexů columnstore. COLUMNSTORE_ARCHIVE dále zkracuje stůl nebo přepážku na menší velikost. Můžete ho použít pro archivaci nebo v jiných situacích, které vyžadují menší velikost úložiště a mohou si dovolit více času pro ukládání a načítání.
Další informace najdete v tématu Komprese dat.
XML_COMPRESSION
platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje možnost komprese XML pro všechny xml sloupce datového typu v tabulce. Možnosti jsou následující:
ON
Sloupce používající datový typ xml jsou komprimované.
OFF
Sloupce používající xml datový typ nejsou komprimované.
NA PARTCÍCH ( { <partition_number_expression> | [ ,... n ] )
Určuje oddíly, na které se vztahují nastavení DATA_COMPRESSION nebo XML_COMPRESSION. Pokud tabulka není rozdělená na oddíly, ON PARTITIONS argument vygeneruje chybu. Pokud klauzule není poskytnuta ON PARTITIONS , DATA_COMPRESSION tato možnost platí pro všechny oddíly rozdělené tabulky.
partition_number_expression lze zadat následujícími způsoby:
- Zadejte číslo oddílu oddílu, například:
ON PARTITIONS (2) - Zadejte čísla oddílů pro několik jednotlivých oddílů oddělených čárkami, například:
ON PARTITIONS (1, 5) - Zadejte rozsahy i jednotlivé oddíly, například:
ON PARTITIONS (2, 4, 6 TO 8)
<range> lze zadat jako čísla oddílů oddělená slovem TO, například: ON PARTITIONS (6 TO 8).
Pokud chcete nastavit různé typy komprese dat pro různé oddíly, zadejte DATA_COMPRESSION možnost více než jednou, například:
WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);
Můžete také zadat XML_COMPRESSION možnost více než jednou, například:
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 ::=
Určuje jednu nebo více možností indexu. Úplný popis těchto možností najdete v tématu CREATE INDEX.
PAD_INDEX = { ON | VYPNUTO }
Pokud je zapnuto, procento volného místa určené funkcí FILLFACTOR se použije na stránky zprostředkující úrovně indexu. Pokud není zadaná hodnota VYPNUTÁ nebo FILLFACTOR, zaplní se stránky střední úrovně tak, aby se blíží kapacitě, takže je dostatek místa pro alespoň jeden řádek maximální velikosti, kterou index může mít vzhledem k sadě klíčů na zprostředkujících stránkách. Výchozí hodnota je VYPNUTÁ.
FILLFACTOR = fillfactor
Určuje procento, které určuje, jak by měl databázový stroj během vytváření nebo změny indexu nastavit úroveň listu každé stránky indexu. fillfactor musí být celočíselná hodnota od 1 do 100. Výchozí hodnota je 0. Hodnoty výplňového faktoru 0 a 100 jsou ve všech ohledech stejné.
IGNORE_DUP_KEY = { ON | VYPNUTO }
Určuje chybovou odpověď, když se operace vložení pokusí vložit duplicitní hodnoty klíče do jedinečného indexu. Možnost IGNORE_DUP_KEY se vztahuje pouze na operace vložení po vytvoření nebo vytvoření indexu. Možnost nemá žádný vliv při provádění CREATE INDEX, ALTER INDEXnebo UPDATE. Výchozí hodnota je VYPNUTÁ.
ON
Při vložení duplicitních hodnot klíče do jedinečného indexu dojde k upozornění. Pouze řádky, které porušují omezení jedinečnosti, selžou.
OFF
Při vložení duplicitních hodnot klíče do jedinečného indexu se zobrazí chybová zpráva. Celá operace INSERT je vrácena zpět.
IGNORE_DUP_KEY nelze nastavit na hodnotu ZAPNUTO pro indexy vytvořené v zobrazení, ne jedinečné indexy, indexy XML, prostorové indexy a filtrované indexy.
Chcete-li zobrazit
V zpětně kompatibilní syntaxi je WITH IGNORE_DUP_KEY ekvivalentní WITH IGNORE_DUP_KEY = ON.
STATISTICS_NORECOMPUTE = { ON | VYPNUTO }
Pokud je zapnuto, statistiky zastaralého indexu se automaticky nepřepočítá. Pokud je tato možnost vypnutá, je povolená automatická aktualizace statistik. Výchozí hodnota je VYPNUTÁ.
ALLOW_ROW_LOCKS = { ON | VYPNUTO }
Pokud je zapnuto, jsou zámky řádků povoleny, když přistupujete k indexu. Databázový stroj určuje, kdy se používají zámky řádků. Pokud je vypnuto, zámky řádků se nepoužívají. Výchozí hodnota je ZAPNUTÁ.
ALLOW_PAGE_LOCKS = { ON | VYPNUTO }
Pokud je zapnuto, jsou při přístupu k indexu povoleny zámky stránek. Databázový stroj určuje, kdy se používají zámky stránek. Pokud je vypnuto, zámky stránek se nepoužívají. Výchozí hodnota je ZAPNUTÁ.
OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | VYPNUTO }
Platí na: SQL Server 2019 (15.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje, jestli se má optimalizovat pro kolizí vložení poslední stránky. Výchozí hodnota je VYPNUTÁ. Další informace najdete v části Sekvenční klíče na stránce CREATE INDEX.
FILETABLE_DIRECTORY = directory_name
platí pro: SQL Server 2012 (11.x) a novější verze.
Určuje název adresáře FileTable kompatibilní se systémem Windows. Tento název by měl být jedinečný mezi všemi názvy adresářů FileTable v databázi. Porovnání jedinečnosti nerozlišuje malá a velká písmena bez ohledu na nastavení kolace. Pokud tato hodnota není zadaná, použije se název FileTable.
FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
platí pro: SQL Server 2012 (11.x) a novější verze. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.
Určuje název kolace, který se má použít pro Name sloupec v tabulce FileTable. Kolace musí být nerozlišující velká a malá písmena, aby byla v souladu s sémantikou pojmenování souborů operačního systému Windows. Pokud tato hodnota není zadaná, použije se výchozí kolace databáze. Pokud výchozí kolace databáze rozlišují malá a velká písmena, vyvolá se chyba a operace CREATE TABLE selže.
collation_name
Název kolace nerozlišující malá a velká písmena.
database_default
Určuje, že se má použít výchozí kolace databáze. Tato kolace musí být nerozlišující malá a velká písmena.
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
platí pro: SQL Server 2012 (11.x) a novější verze. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.
Určuje název, který se má použít pro omezení primárního klíče, které se automaticky vytvoří v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name
platí pro: SQL Server 2012 (11.x) a novější verze. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.
Určuje název, který se má použít pro jedinečné omezení, které se automaticky vytvoří ve sloupci stream_id v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name
platí pro: SQL Server 2012 (11.x) a novější verze. Azure SQL Database a Azure SQL Managed Instance nepodporují FILETABLE.
Určuje název, který se má použít pro jedinečné omezení, které se automaticky vytvoří na parent_path_locator a sloupcích názvů v tabulce FileTable. Pokud tato hodnota není zadaná, systém vygeneruje název omezení.
SYSTEM_VERSIONING = ZAPNUTO [ ( HISTORY_TABLE = schema_name.history_table_name [ , HISTORY_RETENTION_PERIOD = history_retention_period ] [ , DATA_CONSISTENCY_CHECK = { ZAPNUTO | VYPNUTO } ] ) ]
Platí na: SQL Server 2016 (13.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Povolí systémovou správu verzí tabulky, pokud jsou splněny požadavky na omezení datového typu, omezení nullability a primárního klíče. Systém zaznamenává historii každého záznamu v tabulce se systémovou verzí v samostatné tabulce historie.
HISTORY_TABLE Pokud se argument nepoužívá, název této tabulky historie je MSSQL_TemporalHistoryFor<primary_table_object_id>. Pokud je název tabulky historie zadán během vytváření tabulky historie, je nutné zadat schéma a název tabulky.
Pokud tabulka historie neexistuje, systém vygeneruje novou tabulku historie, která odpovídá schématu aktuální tabulky ve stejné skupině souborů jako aktuální tabulka, a vytvoří propojení mezi těmito dvěma tabulkami a umožní systému zaznamenávat historii jednotlivých záznamů v aktuální tabulce v tabulce historie. Ve výchozím nastavení je tabulka historie PAGE komprimována.
Pokud se HISTORY_TABLE argument používá k vytvoření propojení a použití existující tabulky historie, vytvoří se propojení mezi aktuální tabulkou a zadanou tabulkou. Pokud je aktuální tabulka rozdělená na oddíly, vytvoří se ve výchozí skupině souborů tabulka historie, protože konfigurace dělení se automaticky nereplikuje z aktuální tabulky do tabulky historie. Při vytváření odkazu na existující tabulku historie můžete provést kontrolu konzistence dat. Tato kontrola konzistence dat zajišťuje, že se existující záznamy nepřekrývají. Provedení kontroly konzistence dat je výchozí.
Tento argument použijte s argumenty PERIOD FOR SYSTEM_TIME a GENERATED ALWAYS AS ROW { START | END } povolte správu verzí systému v tabulce. Další informace naleznete v tématu časové tabulky. Tento argument s argumentem WITH LEDGER = ON použijte k vytvoření aktualizovatelné tabulky registru. Použití existujících tabulek historie s tabulkami registru není povolené.
Pro více informací o HISTORY_RETENTION_PERIOD, viz Správa historických dat v časových tabulkách s politikou uchovávání.
Pro více informací o DATA_CONSISTENCY_CHECK, viz Kontroly konzistence systému časové tabulky.
REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ] | OFF ( MIGRATION_STATE = PAUSED ) }
Platí pro: SQL Server 2016 (13.x) a novější verze.
Vytvoří novou tabulku s povolenou nebo zakázanou funkcí Stretch Database. Další informace najdete v tématu Stretch Database.
Important
Funkce Stretch Database je v SQL Serveru 2022 (16.x) a Azure SQL Database zastaralá. Tato funkce bude odebrána v budoucí verzi databázového stroje. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.
povolení funkce Stretch Database pro tabulku
Když funkci Stretch pro tabulku povolíte zadáním ON, můžete volitelně zadat MIGRATION_STATE = OUTBOUND , že chcete začít migrovat data okamžitě nebo MIGRATION_STATE = PAUSED odložit migraci dat. Výchozí hodnota je MIGRATION_STATE = OUTBOUND. Další informace o povolení funkce Stretch pro tabulku najdete v tématu Povolení funkce Stretch Database pro tabulku.
Prerequisites. Před povolením funkce Stretch pro tabulku musíte povolit funkci Stretch na serveru a v databázi. Další informace najdete v tématu Povolení funkce Stretch Database pro databázi.
Permissions. Povolení funkce Stretch pro databázi nebo tabulku vyžaduje db_owner oprávnění. Povolení funkce Stretch pro tabulku také vyžaduje oprávnění ALTER v tabulce.
[ FILTER_PREDICATE = { NULL | predikát } ]
Platí pro: SQL Server 2016 (13.x) a novější verze.
Volitelně určuje predikát filtru pro výběr řádků, které se mají migrovat z tabulky, která obsahuje historická i aktuální data. Predikát musí volat deterministické vložené funkce s hodnotou tabulky. Další informace najdete v tématu Povolení funkce Stretch Database pro tabulku a výběr řádků, které chcete migrovat pomocí funkce filtru.
Important
Pokud zadáte predikát filtru, který se provádí špatně, migrace dat také funguje špatně. Funkce Stretch Database použije predikát filtru na tabulku pomocí operátoru CROSS APPLY.
Pokud nezadáte predikát filtru, celá tabulka se migruje.
Když zadáte predikát filtru, musíte také zadat MIGRATION_STATE.
MIGRATION_STATE = { ODCHOZÍ | PŘÍCHOZÍ | POZASTAVENO }
Platí na: SQL Server 2016 (13.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určete
OUTBOUND, jak migrovat data z SQL Serveru do Služby Azure SQL Database.Určete
INBOUND, že chcete zkopírovat vzdálená data pro tabulku ze služby Azure SQL Database zpět na SQL Server a zakázat funkci Stretch pro tabulku. Další informace najdete v tématu Zakázání funkce Stretch Database a vrácení vzdálených dat.Tato operace nese náklady na přenos dat a nedá se zrušit.
Zadejte
PAUSEDk pozastavení nebo odložení migrace dat. Další informace najdete v tématu Pozastavení a obnovení migrace dat -Stretch Database.
[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | YEARS } ) } ]
Platí pro: Pouze Azure SQL Edge
Umožňuje vyčištění starých nebo starých dat z tabulek v databázi na základě zásad uchovávání informací. Další informace najdete v tématu Povolení a zakázáníuchovávání dat . Aby bylo možné povolit uchovávání dat, musí být zadány následující parametry.
FILTER_COLUMN = { column_name }
Určuje sloupec, který se má použít k určení, jestli jsou řádky v tabulce zastaralé nebo ne. Pro sloupec filtru jsou povoleny následující datové typy.
- date
- datetime
- datetime2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITE | číslo {DEN | DNY | TÝDEN | TÝDNY | MĚSÍC | MĚSÍCE | ROK | ROKY }}
Určuje zásady doby uchovávání informací pro tabulku. Doba uchovávání je určena jako kombinace kladné celočíselné hodnoty a jednotky části kalendářního data.
MEMORY_OPTIMIZED
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance. Spravovaná instance Azure SQL nepodporuje tabulky optimalizované pro paměť na úrovni Pro obecné účely.
Hodnota ON označuje, že tabulka je optimalizována pro paměť. Tabulky optimalizované pro paměť jsou součástí funkce In-Memory OLTP, která se používá k optimalizaci výkonu zpracování transakcí. Pro začátek s In-Memory OLTP viz Průzkum počátečních oblastí v In-Memory OLTP. Pro podrobnější informace o tabulkách optimalizovaných pro paměť viz Ukázková databáze pro OLTP v paměti.
Výchozí hodnota OFF označuje, že tabulka je založená na disku.
DURABILITY
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Hodnota SCHEMA_AND_DATA označuje, že tabulka je odolná, což znamená, že změny jsou trvalé na disku a přežijí restartování nebo převzetí služeb při selhání. SCHEMA_AND_DATA je výchozí hodnota.
Hodnota SCHEMA_ONLY označuje, že tabulka není odolná. Schéma tabulky je trvalé, ale žádné aktualizace dat se neuchovávají při restartování nebo převzetí služeb při selhání databáze.
DURABILITY = SCHEMA_ONLY je povolena pouze s MEMORY_OPTIMIZED = ON.
Warning
Když je tabulka vytvořena s DURABILITY = SCHEMA_ONLY, a READ_COMMITTED_SNAPSHOT následně změněna pomocí ALTER DATABASE, data v tabulce jsou ztracena.
BUCKET_COUNT
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje počet kbelíků, které by se měly vytvořit v indexu hash. Maximální hodnota BUCKET_COUNT v indexech hash je 1 073 741 824. Další informace o počtech kontejnerů najdete v tématu Indexy v tabulkách Memory-Optimized.
Bucket_count je povinný argument.
INDEX
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Indexy sloupců a tabulek lze zadat jako součást příkazu CREATE TABLE. Podrobnosti o přidávání a odebírání indexů v tabulkách optimalizovaných pro paměť najdete v tématu Altering Memory-Optimized Tables
HASH
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Označuje, že je vytvořen index HASH.
Indexy hash jsou podporovány pouze v tabulkách optimalizovaných pro paměť.
LEDGER = ZAPNUTO ( <ledger_option> [ ,... n ] ) | PRYČ
Platí pro: SQL Server 2022 (16.x), Azure SQL Database a Azure SQL Managed Instance
Note
Pokud příkaz vytvoří tabulku registru, je vyžadováno ENABLE LEDGER oprávnění.
Určuje, zda je vytvářená tabulka hlavní knihy (ON) nebo ne (VYPNUTO). Výchozí hodnota je VYPNUTÁ. Pokud je tato APPEND_ONLY = ON možnost zadaná, vytvoří systém tabulku registru, která umožňuje pouze vkládání nových řádků. V opačném případě systém vytvoří aktualizovatelnou tabulku registru. Aktualizovatelná tabulka registru také vyžaduje SYSTEM_VERSIONING = ON argument. Aktualizovatelná tabulka registru musí být také tabulka se systémovou verzí. Aktualizovatelná tabulka registru ale nemusí být dočasnou tabulkou (nevyžaduje parametr PERIOD FOR SYSTEM_TIME ). Pokud je zadaná tabulka historie a LEDGER = ONSYSTEM_VERSIONING = ONnesmí odkazovat na existující tabulku.
Databáze registru (databáze vytvořená s LEDGER = ON možností) umožňuje pouze vytváření tabulek registru. Pokusy vytvořit tabulku s LEDGER = OFF vyvolají chybu. Každá nová tabulka je ve výchozím nastavení vytvořena jako aktualizovatelná tabulka účetní knihy, i když nespecifikujete LEDGER = ON, a je vytvořena s výchozími hodnotami pro všechny ostatní parametry.
Aktualizovatelná tabulka registru musí obsahovat čtyři GENERATED ALWAYS sloupce, přesně jeden sloupec definovaný s každým z následujících argumentů:
GENERATED ALWAYS AS TRANSACTION_ID STARTGENERATED ALWAYS AS TRANSACTION_ID ENDGENERATED ALWAYS AS SEQUENCE_NUMBER STARTGENERATED ALWAYS AS SEQUENCE_NUMBER END
Tabulka registru jen pro připojení musí obsahovat přesně jeden sloupec definovaný s každým z následujících argumentů:
GENERATED ALWAYS AS TRANSACTION_ID STARTGENERATED ALWAYS AS SEQUENCE_NUMBER START
Pokud některý z požadovaných vygenerovaných vždy sloupců není definován ve příkazu CREATE TABLE a příkaz obsahuje LEDGER = ON, systém se automaticky pokusí přidat sloupec pomocí příslušné definice sloupců z níže uvedeného seznamu. Pokud dojde ke konfliktu jmen s již definovaným sloupcem, systém zobrazí chybu.
[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<> určuje schéma a název zobrazení registru, systém automaticky vytvoří a prodá propojení s tabulkou. Pokud není tato možnost zadaná, systém vygeneruje název zobrazení registru připojením _Ledger k názvu vytvářené tabulky (database_name.schema_name.table_name). Pokud existuje pohled s daným nebo generovaným názvem, systém zobrazí chybu. Pokud je tabulka aktualizovatelnou tabulkou registru, vytvoří se zobrazení registru jako sjednocení tabulky a její tabulky historie.
Každý řádek v zobrazení hlavní knihy představuje buď vytvoření nebo odstranění verze řádku v tabulce registru. Zobrazení hlavní knihy obsahuje všechny sloupce tabulky registru s výjimkou vygenerovaných sloupců uvedených výše. Zobrazení hlavní knihy obsahuje také následující další sloupce:
| Název sloupce | Datový typ | Description |
|---|---|---|
Zadáno pomocí TRANSACTION_ID_COLUMN_NAME možnosti.
ledger_transaction_id pokud není zadáno. |
bigint | ID transakce, která vytvořila nebo odstranila verzi řádku. |
Zadáno pomocí SEQUENCE_NUMBER_COLUMN_NAME možnosti.
ledger_sequence_number pokud není zadáno. |
bigint | Pořadové číslo operace na úrovni řádku v rámci transakce v tabulce. |
Zadáno pomocí OPERATION_TYPE_COLUMN_NAME možnosti.
ledger_operation_type pokud není zadáno. |
tinyint | Obsahuje 1 (INSERT) nebo 2 (DELETE). Vložení řádku do tabulky registru vytvoří nový řádek v zobrazení registru obsahujícím 1 tento sloupec. Odstranění řádku z tabulky registru vytvoří nový řádek v zobrazení registru obsahujícím 2 tento sloupec. Aktualizace řádku v tabulce registru vytvoří v zobrazení registru dva nové řádky. Jeden řádek obsahuje 2 (DELETE) a druhý řádek obsahuje 1 (INSERT) v tomto sloupci . |
Zadáno pomocí OPERATION_TYPE_DESC_COLUMN_NAME možnosti.
ledger_operation_type_desc pokud není zadáno. |
nvarchar(128) | Obsahuje INSERT nebo DELETE. Podrobnosti najdete výše. |
Transakce, které zahrnují vytváření tabulky registru, jsou zachyceny v sys.database_ledger_transactions.
< >ledger_option ::=
Určuje možnost registru.
[ LEDGER_VIEW = schema_name. ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ]
Určuje název zobrazení registru a názvy dalších sloupců, které systém přidá do zobrazení registru.
[ APPEND_ONLY = ON | VYPNUTO ]
Určuje, jestli je tabulka registru vytvořená pouze pro připojení nebo aktualizovatelná. Výchozí hodnota je OFF.
< >ledger_view_option ::=
Určuje jednu nebo více možností zobrazení registru. Každá možnost zobrazení v ledgeru specifikuje název sloupce, který systém přidává do pohledu, kromě sloupců definovaných v ledger tabulce.
[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
Určuje název sloupce, který ukládá ID transakce, která vytvořila nebo odstranila verzi řádku. Výchozí název sloupce je ledger_transaction_id.
[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
Určuje název sloupců, které ukládají pořadové číslo operace na úrovni řádků v rámci transakce v tabulce. Výchozí název sloupce je ledger_sequence_number.
[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
Určuje název sloupců, do kterých se ukládá ID typu operace. Výchozí název sloupce je ledger_operation_type.
[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
Určuje název sloupců, které ukládají popis typu operace. Výchozí název sloupce je ledger_operation_type_desc.
Remarks
Pro informace o počtu povolených tabulek, sloupců, omezení a indexů viz Maximální kapacitní specifikace pro SQL Server.
Mezera se obecně přiděluje tabulkám a indexům v přírůstcích po jednom rozsahu. Když SET MIXED_PAGE_ALLOCATION je volba nastavena ALTER DATABASE na TRUE, nebo vždy před SQL Server 2016 (13.x), při vytváření tabulky nebo indexu jsou stránky alokovány z různých rozsahů, dokud nemá dostatek stránek pro vyplnění jednotného rozsahu. Jakmile bude dostatek stránek k vyplnění jednotného rozsahu, přidělí se další rozsah pokaždé, když se aktuálně přidělené rozsahy zaplní. V sestavě o množství přiděleného prostoru a používaném tabulkou spusťte sp_spaceusedpříkaz .
Databázový stroj nevynucuje pořadí, ve kterém jsou v definici sloupce zadána omezení DEFAULT, IDENTITY, ROWGUIDCOL nebo column.
Při vytvoření tabulky je možnost QUOTED IDENTIFIER vždy uložena jako ON v metadatech tabulky, i když je tato možnost při vytváření tabulky nastavena na VYPNUTO.
V SQL databázi v Microsoft Fabric lze některé tabulkové funkce vytvářet, ale nejsou zrcadleny do Fabric OneLake. Pro více informací viz Omezení pro zrcadlení databází Fabric SQL.
Dočasné tabulky
Můžete vytvořit místní a globální dočasné tabulky. Místní dočasné tabulky jsou viditelné pouze v aktuální relaci a globální dočasné tabulky jsou viditelné pro všechny relace. Dočasné tabulky nelze rozdělit na oddíly.
Předpona místních dočasných tabulek se znaménkem jediného čísla (#table_name) a předponou globálních dočasných tabulek se znaménkem dvojitého čísla (##table_name).
Transact-SQL příkazy odkazují na dočasnou tabulku pomocí hodnoty zadané pro table_name v CREATE TABLE příkazu, například:
CREATE TABLE #MyTempTable
(
col1 INT PRIMARY KEY
);
INSERT INTO #MyTempTable
VALUES (1);
Pokud je uvnitř jedné uložené procedury nebo dávky vytvořena více než jedna dočasná tabulka, musí mít různé názvy.
Pokud při vytváření nebo přístupu k dočasné tabulce zahrnete schema_name , ignoruje se. Ve schématu dbo se vytvoří všechny dočasné tabulky.
Pokud je místní dočasná tabulka vytvořená v uložené proceduře nebo modulu SQL, který lze spustit současně několika relacemi, databázový stroj musí být schopen rozlišit tabulky vytvořené různými relacemi. Databázový stroj to provede interně připojením jedinečné přípony ke každému místnímu dočasnému názvu tabulky. Úplný název dočasné tabulky uložené v sys.objects tabulce tempdb je tvořen názvem tabulky zadaným v CREATE TABLE příkazu a systémově vygenerovanou jedinečnou příponou. Pokud chcete příponu povolit, table_name zadané pro místní dočasný název nesmí překročit 116 znaků.
Dočasné tabulky se automaticky zahodí, když přejdou mimo rozsah, pokud explicitně nezahodíte dříve pomocí DROP TABLE:
- Místní dočasná tabulka vytvořená v uložené proceduře se po dokončení uložené procedury automaticky zahodí. Na tabulku lze odkazovat všemi vnořenými uloženými procedurami spuštěnými uloženou procedurou, která tabulku vytvořila. Na tabulku nelze odkazovat procesem, který se nazývá uložená procedura, která tabulku vytvořila.
- Všechny ostatní místní dočasné tabulky se automaticky zahodí na konec aktuální relace.
-
GLOBAL_TEMPORARY_TABLE_AUTO_DROPPokud je konfigurace v oboru databáze nastavená na ZAPNUTO (výchozí), globální dočasné tabulky se automaticky zahodí, když relace, která vytvořila tabulku, skončí a všechny ostatní úlohy na ně přestaly odkazovat. Přidružení mezi úkolem a tabulkou se udržuje pouze po dobu životnosti jednoho příkazu Transact-SQL. To znamená, že globální dočasná tabulka se při dokončení posledního příkazu Transact-SQL, který při vytváření relace aktivně odkazoval na tabulku. -
GLOBAL_TEMPORARY_TABLE_AUTO_DROPPokud je konfigurace s oborem databáze nastavena na vypnuto, globální dočasné tabulky se zahodí pouze pomocíDROP TABLE, nebo když se instance databázového stroje restartuje. Další informace najdete v tématu GLOBAL_TEMPORARY_TABLE_AUTO_DROP.
Místní dočasná tabulka vytvořená v rámci uložené procedury nebo triggeru může mít stejný název jako dočasná tabulka vytvořená před voláním uložené procedury nebo triggeru. Pokud však dotaz odkazuje na dočasnou tabulku a dvě dočasné tabulky se stejným názvem existují v té době, není definována, pro kterou tabulku se dotaz přeloží. Vnořené uložené procedury mohou také vytvářet dočasné tabulky se stejným názvem jako dočasná tabulka vytvořená voláním uložené procedury. Aby se však změny přeložily na tabulku vytvořenou v vnořeném postupu, musí mít tabulka stejnou strukturu se stejnými názvy sloupců jako tabulka vytvořená ve volající procedurě. To je znázorněno v následujícím příkladu.
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
Tady je soubor výsledků.
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
Při vytváření místních nebo globálních dočasných tabulek CREATE TABLE syntaxe podporuje definice omezení s výjimkou FOREIGN KEY omezení.
FOREIGN KEY Pokud je omezení zadané v dočasné tabulce, příkaz vrátí zprávu s upozorněním, že omezení bylo vynecháno. Tabulka je stále vytvořená bez FOREIGN KEY omezení. Na dočasné tabulky nelze odkazovat v FOREIGN KEY omezeních.
Pokud se v rámci transakce definované uživatelem vytváří dočasná tabulka s pojmenovaným omezením, může příkaz, který dočasnou tabulku vytvoří, spustit pouze jeden uživatel najednou. Pokud například uložená procedura vytvoří dočasnou tabulku s omezením pojmenovaného primárního klíče, uložená procedura se nedá spustit současně více uživateli.
Globální dočasné tabulky s oborem databáze ve službě Azure SQL Database
Globální dočasné tabulky v SQL Serveru (názvy tabulek s předponou ##) jsou uloženy a tempdb sdíleny mezi všemi uživatelskými relacemi v celé instanci SQL Serveru.
Azure SQL Database podporuje globální dočasné tabulky, které jsou také uložené, tempdb ale jsou omezené na úroveň databáze. To znamená, že globální dočasné tabulky jsou sdíleny mezi všemi uživatelskými relacemi ve stejné databázi. Uživatelské relace z jiných databází nemají přístup k globálním dočasným tabulkám. V opačném případě se globální dočasné tabulky pro Azure SQL Database řídí stejnou syntaxí a sémantikou, kterou SQL Server používá.
Podobně globální dočasné uložené procedury jsou také vymezeny na úrovni databáze v Azure SQL Database.
Místní dočasné tabulky (názvy tabulek s předponou #) jsou podporovány také pro Azure SQL Database a používají stejnou syntaxi a sémantiku, kterou SQL Server používá. Další informace naleznete v tématu Dočasné tabulky.
Oprávnění pro dočasné objekty
Každý uživatel může vytvářet dočasné objekty a přistupovat k němu.
Dělené tabulky
Před vytvořením dělené tabulky pomocí příkazu CREATE TABLE musíte nejprve vytvořit funkci oddílu, abyste určili, jak se tabulka rozdělí. Funkce oddílu se vytvoří pomocí funkce CREATE PARTITION. Za druhé, musíte vytvořit schéma oddílů, které určí skupiny souborů, které budou obsahovat oddíly označené funkcí oddílu. Schéma oddílů se vytvoří pomocí schématu CREATE PARTITION SCHEME. Umístění omezení PRIMÁRNÍ KLÍČ nebo UNIQUE pro samostatné skupiny souborů nelze zadat pro dělené tabulky. Další informace najdete v tématu Dělené tabulky a indexy.
Omezení PRIMÁRNÍHO KLÍČE
Tabulka může obsahovat pouze jedno omezení PRIMÁRNÍHO KLÍČE.
Index vygenerovaný omezením PRIMÁRNÍHO KLÍČE nemůže způsobit, že počet indexů v tabulce překročí 999 neclusterovaných indexů a 1 clusterovaný index.
Pokud pro omezení PRIMÁRNÍHO KLÍČE není zadán clusterED nebo NONCLUSTERED, použije se clusterED, pokud pro omezení UNIQUE nejsou zadané žádné clusterované indexy.
Všechny sloupce definované v rámci omezení PRIMÁRNÍHO KLÍČE musí být definovány jako NOT NULL. Pokud není zadána možnost null, všechny sloupce, které se účastní omezení PRIMÁRNÍHO KLÍČE, mají nastavenou hodnotu nullability na HODNOTU NOT NULL.
Note
Pro tabulky optimalizované pro paměť je povolený sloupec klíče s možnou hodnotou null.
Pokud je primární klíč definován ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat binární řazení. Další informace najdete v tématu uživatelem definované typy CLR.
Jedinečná omezení
- Pokud pro omezení UNIQUE není zadaný CLUSTERED nebo NONCLUSTERED, použije se ve výchozím nastavení funkce NONCLUSTERED.
- Každé omezení UNIQUE generuje index. Počet omezení UNIQUE nemůže způsobit, že počet indexů v tabulce překročí 999 neclusterovaných indexů a 1 clusterovaný index.
- Pokud je jedinečné omezení definováno ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat řazení na základě binárního souboru nebo operátoru. Další informace najdete v tématu uživatelem definované typy CLR.
Omezení CIZÍHO KLÍČE
Pokud je do sloupce omezení CIZÍ KLÍČ zadána jiná hodnota než NULL, musí tato hodnota existovat v odkazovaném sloupci; v opačném případě se vrátí chybová zpráva o porušení cizího klíče.
Omezení cizího klíče se použijí na předchozí sloupec, pokud nejsou zadány zdrojové sloupce.
Omezení cizího klíče můžou odkazovat pouze na tabulky ve stejné databázi na stejném serveru. Referenční integrita mezi databázemi musí být implementována prostřednictvím triggerů. Další informace najdete v tématu CREATE TRIGGER.
Omezení cizího klíče můžou odkazovat na jiný sloupec ve stejné tabulce. Označuje se jako odkaz na sebe sama.
Klauzule REFERENCES omezení CIZÍHO KLÍČE na úrovni sloupce může obsahovat pouze jeden odkazový sloupec. Tento sloupec musí mít stejný datový typ jako sloupec, na kterém je definováno omezení.
Klauzule REFERENCES omezení cizího klíče na úrovni tabulky musí mít stejný počet sloupců odkazu jako počet sloupců v seznamu sloupců omezení. Datový typ každého referenčního sloupce musí být také stejný jako odpovídající sloupec v seznamu sloupců. Referenční sloupce musí být zadány ve stejném pořadí, které se použily při zadávání sloupců primárního klíče nebo jedinečného omezení odkazované tabulky.
CASCADE, SET NULL nebo SET DEFAULT nelze zadat, pokud je sloupec časového razítka typu součástí cizího klíče nebo odkazovaného klíče.
CASCADE, SET NULL, SET DEFAULT a NO ACTION se dají kombinovat u tabulek, které mají vzájemně referenční relace. Pokud databázový stroj narazí na žádnou akci, zastaví a vrátí zpět související akce CASCADE, SET NULL a SET DEFAULT. Když příkaz DELETE způsobí kombinaci kaskádových akcí, SET NULL, SET DEFAULT a NO ACTION, všechny akce CASCADE, SET NULL a SET DEFAULT se použijí před tím, než databázový stroj zkontroluje žádnou AKCI.
Databázový stroj nemá předdefinovaný limit počtu omezení cizího klíče, která tabulka může obsahovat odkaz na jiné tabulky, nebo počet omezení CIZÍHO KLÍČE vlastněných jinými tabulkami, které odkazují na konkrétní tabulku.
Skutečný počet omezení cizího klíče, která lze použít, je však omezen konfigurací hardwaru a návrhem databáze a aplikace. Doporučujeme, aby tabulka neobsahovala více než 253 omezení cizího klíče a aby na ni odkazovala maximálně 253 omezení CIZÍHO KLÍČE. Efektivní limit pro vás může být více nebo méně v závislosti na aplikaci a hardwaru. Při návrhu databáze a aplikací zvažte náklady na vynucování omezení CIZÍHO KLÍČE.
Omezení cizího klíče se u dočasných tabulek nevynucuje.
Omezení CIZÍHO KLÍČE můžou odkazovat pouze na sloupce v primárním klíči nebo jedinečných omezeních v odkazované tabulce nebo v jedinečném indexu odkazované tabulky.
Pokud je cizí klíč definován ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat binární řazení. Další informace najdete v tématu uživatelem definované typy CLR.
Sloupce, které se účastní relace cizího klíče, musí být definovány se stejnou délkou a měřítkem.
VÝCHOZÍ definice
Sloupec může mít pouze jednu výchozí definici.
Definice DEFAULT může obsahovat konstantní hodnoty, funkce, standardní niladické funkce SQL nebo
NULL. Následující tabulka ukazuje niladické funkce a hodnoty, které vrací jako výchozí během příkazu INSERT.FUNKCE SQL-92 niladic Vrácená hodnota CURRENT_TIMESTAMPAktuální datum a čas CURRENT_USERJméno uživatele provádějícího vložení SESSION_USERJméno uživatele provádějícího vložení SYSTEM_USERJméno uživatele provádějícího vložení USERJméno uživatele provádějícího vložení constant_expression v definici DEFAULT nemůže odkazovat na jiný sloupec v tabulce ani na jiné tabulky, zobrazení nebo uložené procedury.
Výchozí definice nelze vytvořit ve sloupcích s datovým typem časového razítka nebo sloupci s vlastností IDENTITY.
Výchozí definice nelze vytvořit pro sloupce s datovými typy aliasů, pokud je datový typ aliasu svázán s výchozím objektem.
Omezení CHECK
Sloupec může mít libovolný počet omezení CHECK a podmínka může obsahovat více logických výrazů v kombinaci s operátory AND a OR. Více omezení CHECK pro sloupec se ověřuje v pořadí, v jakém jsou vytvořeny.
Podmínka hledání musí být vyhodnocena jako logický výraz a nemůže odkazovat na jinou tabulku.
Omezení CHECK na úrovni sloupce může odkazovat pouze na omezený sloupec a omezení CHECK na úrovni tabulky může odkazovat pouze na sloupce ve stejné tabulce.
FUNKCE CHECK OMEZENÍ a pravidla slouží ke stejné funkci ověřování dat během příkazů INSERT a UPDATE.
Pokud pro sloupec nebo sloupce existuje pravidlo a jedno nebo více omezení CHECK, vyhodnotí se všechna omezení.
Omezení check nelze definovat u sloupců textu, ntextu nebo obrázku .
Další informace o omezeních
- Index vytvořený pro omezení nemůže být vyřazen pomocí ;
DROP INDEXomezení musí být ukončeno pomocí .ALTER TABLEIndex vytvořený pro omezení a jeho použití lze znovu vytvořit pomocíALTER INDEX ... REBUILD. Další informace najdete v tématu Optimalizace údržby indexů za účelem zlepšení výkonu dotazů a snížení spotřeby prostředků. - Názvy omezení musí dodržovat pravidla pro identifikátory s tím rozdílem, že název nemůže začínat znakem čísla (#). Pokud constraint_name nezadáte, přiřadí se k omezení název vygenerovaný systémem. Název omezení se zobrazí ve všech chybových zprávách o porušeních omezení.
- Pokud dojde k porušení omezení v příkazu
INSERT,UPDATEneboDELETEpříkazu, příkaz je ukončen. PokudSET XACT_ABORTje však nastavena na HODNOTU OFF, transakce, pokud je příkaz součástí explicitní transakce, bude nadále zpracována. PokudSET XACT_ABORTje nastavena na HODNOTU ON, celá transakce se vrátí zpět. Příkaz můžete také použítROLLBACK TRANSACTIONs definicí transakce kontrolou@@ERRORsystémové funkce. -
ALLOW_ROW_LOCKS = ONZámkyALLOW_PAGE_LOCK = ONna úrovni řádků, stránek a tabulek jsou povoleny, když přistupujete k indexu. Databázový stroj zvolí příslušný zámek a může zámek eskalovat z řádku nebo zámku stránky na zámek tabulky. PřiALLOW_ROW_LOCKS = OFFaALLOW_PAGE_LOCK = OFFse při přístupu k indexu povolí pouze zámek na úrovni tabulky. - Pokud tabulka obsahuje omezení cizího klíče nebo kontrolní omezení a triggery, podmínky omezení se vyhodnocují před spuštěním triggeru.
Pro sestavu v tabulce a jejích sloupcích použijte sp_help nebo sp_helpconstraint. Pokud chcete přejmenovat tabulku, použijte sp_rename. Pro sestavu zobrazení a uložených procedur závislých na tabulce použijte sys.dm_sql_referenced_entities a sys.dm_sql_referencing_entities.
Pravidla nullability v definici tabulky
Hodnota null ve sloupci určuje, jestli tento sloupec může jako data v daném sloupci povolit hodnotu null (NULL).
NULL není nulová nebo prázdná: NULL znamená, že nebyla provedena žádná položka nebo byla zadána explicitní NULL položka a obvykle to znamená, že hodnota je neznámá nebo není použitelná.
Když použijete CREATE TABLE nebo ALTER TABLE změníte tabulku, ovlivní nastavení databáze a relace a případně přepíšete hodnotu null datového typu, který se používá v definici sloupce. Doporučujeme vždy explicitně definovat sloupec jako NULL nebo NOT NULL pro nekompočítané sloupce, nebo pokud používáte uživatelem definovaný datový typ, že sloupec povolíte použít výchozí hodnotu nullability datového typu. Řídké sloupce musí vždy umožňovat hodnotu NULL.
Pokud není explicitně zadána hodnota null sloupce, možnost null sloupce se řídí pravidly uvedenými v následující tabulce.
| Datový typ sloupce | Rule |
|---|---|
| Datový typ aliasu | Databázový stroj používá hodnotu null, která je zadána při vytvoření datového typu. Chcete-li určit výchozí hodnotu nullability datového typu, použijte sp_help. |
| uživatelsky definovaný typ v jazyce CLR | Hodnota Nullability je určena podle definice sloupce. |
| Datový typ zadaný systémem | Pokud má datový typ zadaný systémem jenom jednu možnost, má přednost. Datové typy časového razítka nesmí být NULL. Pokud jsou všechna nastavení relace nastavená pomocí:SETANSI_NULL_DFLT_ON = ONJe přiřazena hodnota NULL.ANSI_NULL_DFLT_OFF = ONJe přiřazena hodnota NOT NULL.Pokud jsou všechna nastavení databáze nakonfigurovaná pomocí: ALTER DATABASEANSI_NULL_DEFAULT_ON = ONJe přiřazena hodnota NULL.ANSI_NULL_DEFAULT_OFF = ONJe přiřazena hodnota NOT NULL.Pokud chcete zobrazit nastavení databáze pro ANSI_NULL_DEFAULT, použijte sys.databases zobrazení katalogu. |
Pokud pro relaci není nastavená žádná z možností ANSI_NULL_DFLT a databáze je nastavená na výchozí (ANSI_NULL_DEFAULT je vypnutá), je přiřazena výchozí hodnota NOT NULL.
Pokud je sloupec počítaný sloupec, jeho nulovost je vždy automaticky určena databázovým strojem. Chcete-li zjistit nullability tohoto typu sloupce, použijte COLUMNPROPERTY funkci s AllowsNull vlastnost.
Note
Ovladač ODBC SYSTÉMU SQL Server a ovladač OLE DB systému SQL Server mají výchozí nastavení ANSI_NULL_DFLT_ON nastavena na zapnuto. Uživatelé ODBC a OLE DB můžou tuto konfiguraci nakonfigurovat ve zdrojích dat ODBC nebo s atributy připojení nebo vlastnostmi nastavenými aplikací.
Komprese dat
Systémové tabulky nelze povolit pro kompresi. Při vytváření tabulky je komprese dat nastavena na NONE, pokud není zadán jinak. Pokud zadáte seznam oddílů nebo oddíl, který je mimo rozsah, vygeneruje se chyba. Další informace o kompresi dat naleznete v tématu Komprese dat.
Pokud chcete vyhodnotit, jak změna stavu komprese ovlivňuje tabulku, index nebo oddíl, použijte sp_estimate_data_compression_savings uloženou proceduru.
Permissions
Vyžaduje CREATE TABLE oprávnění v databázi a ALTER oprávnění ke schématu, ve kterém se tabulka vytváří.
Pokud jsou v příkazu definovány nějaké sloupce CREATE TABLE typu definovaného uživatelem, REFERENCES je vyžadováno oprávnění k typu definovanému uživatelem.
Pokud jsou některé sloupce ve příkazu CREATE TABLE definovány jako uživatelsky definovaný typ CLR, je vyžadováno vlastnictví tohoto typu nebo REFERENCES oprávnění k němu.
Pokud má některý sloupec ve příkazu CREATE TABLE přiřazenou XML sbírku schémat, je vyžadováno vlastnictví XML schématu nebo REFERENCES oprávnění k ní.
Každý uživatel může vytvořit dočasné tabulky v tempdb.
Pokud příkaz vytvoří tabulku registru, ENABLE LEDGER je vyžadováno oprávnění.
Examples
A. Vytvoření omezení PRIMÁRNÍHO KLÍČE u sloupce
Následující příklad ukazuje definici sloupce pro omezení PRIMÁRNÍ KLÍČ s clusterovaným indexem ve EmployeeID sloupci Employee tabulky. Protože není zadaný název omezení, systém poskytuje název omezení.
CREATE TABLE dbo.Employee
(
EmployeeID INT PRIMARY KEY CLUSTERED
);
B. Použití omezení CIZÍHO KLÍČE
Omezení CIZÍHO KLÍČE se používá k odkazování na jinou tabulku. Cizí klíče můžou být klíče s jedním sloupcem nebo vícesloupcové klíče. Následující příklad ukazuje omezení CIZÍ KLÍČ s jedním sloupcem v SalesOrderHeader tabulce, která odkazuje na SalesPerson tabulku. Pro omezení CIZÍHO KLÍČE s jedním sloupcem se vyžaduje pouze klauzule REFERENCES.
SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)
Můžete také explicitně použít klauzuli FOREIGN KEY a přepsat atribut sloupce. Název sloupce nemusí být v obou tabulkách stejný.
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)
Vícesloupcová omezení klíče se vytvářejí jako omezení tabulky.
AdventureWorks2025 V databázi SpecialOfferProduct obsahuje tabulka vícesloupcový PRIMÁRNÍ KLÍČ. Následující příklad ukazuje, jak odkazovat na tento klíč z jiné tabulky; Explicitní název omezení je nepovinný.
CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
FOREIGN KEY (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
C. Použití omezení UNIQUE
Omezení UNIQUE se používají k vynucení jedinečnosti u neprimárních klíčových sloupců. Následující příklad vynucuje omezení, že Name sloupec Product tabulky musí být jedinečný.
Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED
D. Použití výchozích definic
Při zadání žádné hodnoty zadáte hodnotu (s příkazy INSERT a UPDATE). Databáze může například AdventureWorks2025 obsahovat vyhledávací tabulku se seznamem různých zaměstnanců pracovních míst, která můžou vyplnit společnost. Ve sloupci, který popisuje každou úlohu, může výchozí znakový řetězec zadat popis, pokud není explicitně zadán skutečný popis.
DEFAULT 'New Position - title not formalized yet'
Kromě konstant můžou definice DEFAULT zahrnovat funkce. Pomocí následujícího příkladu získáte aktuální datum položky.
DEFAULT (GETDATE())
Kontrola niladické funkce může také zlepšit integritu dat. Chcete-li sledovat uživatele, který vložil řádek, použijte funkci niladic-function pro USER. Neuzavírajte niladické funkce do závorek.
DEFAULT USER
E. Použití omezení CHECK
Následující příklad ukazuje omezení hodnot zadaných do CreditRating sloupce Vendor tabulky. Omezení není pojmenováno.
CHECK (CreditRating >= 1 and CreditRating <= 5)
Tento příklad ukazuje pojmenované omezení s omezením vzoru na znaková data zadaná do sloupce tabulky.
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]'
)
Tento příklad určuje, že hodnoty musí být v rámci konkrétního seznamu nebo se řídí zadaným vzorem.
CHECK (
emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]'
)
F. Zobrazit úplnou definici tabulky
Následující příklad ukazuje úplné definice tabulky se všemi definicemi omezení pro tabulku PurchaseOrderDetail vytvořenou AdventureWorks2025 v databázi. Pokud chcete spustit ukázku, schéma tabulky se změní 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. Vytvoření tabulky s sloupcem XML zadaným do kolekce schémat XML
Následující příklad vytvoří tabulku se sloupcem xml , který je zadán do kolekce HRResumeSchemaCollectionschémat XML . Klíčové DOCUMENT slovo určuje, že každá instance datového xml typu v column_name může obsahovat pouze jeden prvek nejvyšší úrovně.
CREATE TABLE HumanResources.EmployeeResumes
(
LName NVARCHAR (25),
FName NVARCHAR (25),
Resume XML(DOCUMENT HumanResources.HRResumeSchemaCollection)
);
H. Vytvoření dělené tabulky
Následující příklad vytvoří funkci oddílu pro rozdělení tabulky nebo indexu do čtyř oddílů. Pak příklad vytvoří schéma oddílů, které určuje skupiny souborů, ve kterých se mají uchovávat všechny čtyři oddíly. Nakonec příklad vytvoří tabulku, která používá schéma oddílů. Tento příklad předpokládá, že skupiny souborů již v databázi existují.
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 základě hodnot ve sloupci col1PartitionTablejsou oddíly přiřazeny následujícími způsoby.
| Filegroup | test1fg | test2fg | test3fg | test4fg |
|---|---|---|---|---|
| Partition | 1 | 2 | 3 | 4 |
| Values | col 1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <= 1,000 |
col1 > 1000 |
I. Použití datového typu UNIQUEIDENTIFIER ve sloupci
Následující příklad vytvoří tabulku se sloupcem uniqueidentifier . Příklad používá omezení PRIMÁRNÍHO KLÍČE k ochraně tabulky před uživateli, kteří vkládají duplicitní hodnoty, a používá NEWSEQUENTIALID() funkci v DEFAULT omezení k zadání hodnot pro nové řádky. Vlastnost ROWGUIDCOL se použije u uniqueidentifier sloupce, aby na ni bylo možné odkazovat pomocí $ROWGUID klíčového slova.
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. Použití výrazu pro počítaný sloupec
Následující příklad ukazuje použití výrazu ((low + high)/2) pro výpočet vypočítaného myavg sloupce.
CREATE TABLE dbo.mytable
(
low INT,
high INT,
myavg AS (low + high) / 2
);
K. Vytvoření počítaného sloupce na základě sloupce definovaného uživatelem
Následující příklad vytvoří tabulku s jedním sloupcem definovaným jako uživatelem definovaný typ utf8stringza předpokladu, že sestavení typu a samotný typ již byl vytvořen v aktuální databázi. Druhý sloupec je definován na základě utf8stringa používá metodu ToString()type(class)utf8string k výpočtu hodnoty sloupce.
CREATE TABLE UDTypeTable
(
u UTF8STRING,
ustr AS u.ToString() PERSISTED
);
L. Použití funkce USER_NAME pro počítaný sloupec
Následující příklad používá USER_NAME() funkci ve sloupci myuser_name .
CREATE TABLE dbo.mylogintable
(
date_in DATETIME,
user_id INT,
myuser_name AS USER_NAME()
);
M. Vytvoření tabulky se sloupcem FILESTREAM
Následující příklad vytvoří tabulku, která má FILESTREAM sloupec Photo. Pokud tabulka obsahuje jeden nebo více FILESTREAM sloupců, musí mít tabulka jeden ROWGUIDCOL sloupec.
CREATE TABLE dbo.EmployeePhoto
(
EmployeeId INT NOT NULL PRIMARY KEY,
Photo VARBINARY (MAX) FILESTREAM NULL,
MyRowGuidColumn UNIQUEIDENTIFIER DEFAULT NEWID() ROWGUIDCOL NOT NULL UNIQUE
);
N. Vytvoření tabulky, která používá kompresi řádků
Následující příklad vytvoří tabulku, která používá kompresi řádků.
CREATE TABLE dbo.T1
(
c1 INT,
c2 NVARCHAR (200)
)
WITH (DATA_COMPRESSION = ROW);
Další příklady komprese dat najdete v tématu Komprese dat.
O. Vytvoření tabulky, která používá kompresi XML
platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Následující příklad vytvoří tabulku, která používá kompresi XML.
CREATE TABLE dbo.T1
(
c1 INT,
c2 XML
)
WITH (XML_COMPRESSION = ON);
P. Vytvoření tabulky, která obsahuje řídké sloupce a sadu sloupců
Následující příklady ukazují, jak vytvořit tabulku, která má řídký sloupec, a tabulku se dvěma řídkými sloupci a sadou sloupců. Příklady používají základní syntaxi. Pro složitější příklady viz Použít řídké sloupce a Použít množiny sloupců.
Tento příklad vytvoří tabulku, která má řídký sloupec.
CREATE TABLE dbo.T1
(
c1 INT PRIMARY KEY,
c2 VARCHAR (50) SPARSE NULL
);
Tento příklad vytvoří tabulku, která má dva řídké sloupce a sadu sloupců s názvem 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
);
Q. Vytvoření dočasné tabulky založené na disku se systémem
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Následující příklady ukazují, jak vytvořit dočasnou tabulku propojenou s novou tabulkou historie a jak vytvořit dočasnou tabulku propojenou s existující tabulkou historie. Dočasná tabulka musí mít definovaný primární klíč, aby byla povolena tabulka pro správu verzí systému. Příklady ukazující, jak přidat nebo odebrat správu verzí systému v existující tabulce, najdete v tématu Správa verzí systému v příkladech. Pro případy použití viz Časové tabulky.
Tento příklad vytvoří novou dočasnou tabulku propojenou s novou tabulkou historie.
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);
Tento příklad vytvoří novou dočasnou tabulku propojenou s existující tabulkou historie.
-- 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. Vytvoření dočasné tabulky optimalizované pro systémovou verzi paměti
Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
Následující příklad ukazuje, jak vytvořit dočasnou tabulku optimalizovanou pro systémovou verzi paměti propojenou s novou tabulkou historie založenou na disku.
Tento příklad vytvoří novou dočasnou tabulku propojenou s novou tabulkou historie.
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)
);
Tento příklad vytvoří novou dočasnou tabulku propojenou s existující tabulkou historie.
-- 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. Vytvoření tabulky se šifrovanými sloupci
Následující příklad vytvoří tabulku se dvěma šifrovanými sloupci. Další informace naleznete v tématu 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. Vytvoření vloženého filtrovaného indexu
Vytvoří tabulku s vloženým filtrovaným indexem.
CREATE TABLE t1
(
c1 INT,
INDEX IX1 (c1) WHERE c1 > 0
);
U. Vytvoření vloženého indexu
Následující příklad ukazuje, jak používat vložený příkaz NONCLUSTERED pro diskové tabulky:
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. Vytvoření dočasné tabulky s anonymně pojmenovaným složeným primárním klíčem
Vytvoří tabulku s anonymně pojmenovaným složeným primárním klíčem. To je užitečné, pokud se chcete vyhnout konfliktům za běhu, kdy dvě dočasné tabulky s oborem relace, každý v samostatné relaci, používá stejný název pro omezení.
CREATE TABLE #tmp
(
c1 INT,
c2 INT,
PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO
Pokud omezení explicitně pojmenujete, druhá relace generuje chybu jako:
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.
K problému dochází ze skutečnosti, že zatímco název dočasné tabulky je jedinečný, názvy omezení nejsou.
W. Použití globálních dočasných tabulek ve službě Azure SQL Database
Relace A vytvoří globální dočasnou tabulku ##test ve službě Azure SQL Database testdb1 a přidá jeden řádek.
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';
Tady je soubor výsledků.
1253579504
Získání názvu globální dočasné tabulky pro dané ID objektu 1253579504 v tempdb (2)
SELECT name
FROM tempdb.sys.objects
WHERE object_id = 1253579504;
Tady je soubor výsledků.
##test
Relace B se připojí ke službě Azure SQL Database testdb1 a má přístup k tabulce ##test vytvořené relací A.
SELECT *
FROM ##test;
Tady je soubor výsledků.
1, 1
Relace C se připojí k jiné databázi ve službě Azure SQL Database testdb2 a chce získat přístup k ##test vytvořené v testdb1. Tento výběr selže kvůli rozsahu databáze globálních dočasných tabulek.
SELECT *
FROM ##test;
Tím se vygeneruje následující chyba:
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'
Adresování systémového objektu ve službě Azure SQL Database tempdb z aktuální databáze uživatele testdb1
SELECT *
FROM tempdb.sys.objects;
SELECT *
FROM tempdb.sys.columns;
SELECT *
FROM tempdb.sys.database_files;
X. Povolení zásad uchovávání dat v tabulce
Následující příklad vytvoří tabulku s povoleným uchováváním dat a dobou uchovávání dat o jednom týdnu. Tento příklad platí jenom pro 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. Vytvoření aktualizovatelné tabulky registru
Následující příklad vytváří aktualizovatelnou tabulku účetní knihy, která není časovou tabulkou, s anonymní tabulkou historie (systém generuje název tabulky historie) a názvem zobrazení generované knihy. Protože názvy požadovaných vygenerovaných vždy sloupců a dalších sloupců v ledger view nejsou specifikovány, mají sloupce výchozí názvy.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL,
Salary MONEY NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO
Následující příklad vytvoří tabulku, která je dočasnou i aktualizovatelnou tabulkou registru s anonymní tabulkou historie (s názvem vygenerovaným systémem), vygenerovaným názvem zobrazení registru a výchozími názvy vygenerovaných sloupců vždy a dalších sloupců zobrazení registru.
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
Následující příklad vytvoří tabulku, která je dočasnou i aktualizovatelnou tabulkou registru s explicitně pojmenovanou tabulkou historie, uživatelem zadaným názvem zobrazení registru a uživatelsky zadanými názvy vygenerovaných vždy sloupců a dalších sloupců v zobrazení registru.
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
Následující příklad vytvoří tabulku registru jen pro připojení s vygenerovanými názvy zobrazení registru a sloupci v zobrazení registru.
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
Následující příklad vytvoří databázi registru ve službě Azure SQL Database a aktualizovatelnou tabulku registru pomocí výchozího nastavení. Vytvoření aktualizovatelné tabulky registru v databázi registru nevyžaduje použití 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
Související obsah
- ZMĚNIT TABULKU (Transact-SQL)
- COLUMNPROPERTY (Transact-SQL)
- VYTVOŘTE INDEX (Transact-SQL)
- VYTVOŘIT ZOBRAZENÍ (Transact-SQL)
- Datové typy (Transact-SQL)
- DROP INDEX (Transact-SQL)
- sys.dm_sql_referenced_entities
- sys.dm_sql_referencing_entities
- DROP TABLE (Transact-SQL)
- CREATE PARTITION FUNCTION (Transact-SQL)
- VYTVOŘIT PARTITION SCHEME (Transact-SQL)
- VYTVOŘIT TYP (Transact-SQL)
- EVENTDATA (Transact-SQL)
- sp_help
- sp_helpconstraint
- sp_rename
- sp_spaceused