GoogleSQL data definition language (original) (raw)
Spanner
Bibliotecas de cliente y controladores
Controladores
APIs de Spanner
Referencia de REST
- Introducción
- Parámetros estándar de la API
- Puntos finales de servicio globales y regionales
- Versión 1
* Recursos REST
* Tipos
* ChangeQuorumMetadata
* Código
* CopyBackupMetadata
* CreateBackupMetadata
* CreateDatabaseMetadata
* CreateInstanceConfigMetadata
* CreateInstanceMetadata
* CreateInstancePartitionMetadata
* DatabaseDialect
* DdlStatementActionInfo
* DirectedReadOptions
* EncryptionInfo
* ErrorInfo
* FulfillmentPeriod
* GetPolicyOptions
* Ayuda
* KeySet
* ListOperationsResponse
* MoveInstanceMetadata
* MoveInstanceResponse
* MultiplexedSessionPrecommitToken
* Mutation
* OperationProgress
* OptimizeRestoredDatabaseMetadata
* PartialResultSet
* PartitionOptions
* PartitionResponse
* Política
* QueryMode
* QueryOptions
* RequestOptions
* RestoreDatabaseMetadata
* ResultSet
* ResultSetMetadata
* ResultSetStats
* Status
* StructType
* TestIamPermissionsResponse
* Transacción
* TransactionOptions
* TransactionSelector
* Tipo
* UpdateDatabaseDdlMetadata
* UpdateDatabaseMetadata
* UpdateInstanceConfigMetadata
* UpdateInstanceMetadata
* UpdateInstancePartitionMetadata
* WaitOperationRequest
Referencia de RPC
SQL en Spanner
GoogleSQL
- Sintaxis de consulta
- Funciones
* Todas las funciones
* Funciones de matriz
* Overview
* ARRAY
* ARRAY_CONCAT
* ARRAY_FILTER
* ARRAY_FIRST
* ARRAY_INCLUDES
* ARRAY_INCLUDES_ALL
* ARRAY_INCLUDES_ANY
* ARRAY_IS_DISTINCT
* ARRAY_LAST
* ARRAY_LENGTH
* ARRAY_MAX
* ARRAY_MIN
* ARRAY_REVERSE
* ARRAY_SLICE
* ARRAY_TO_STRING
* ARRAY_TRANSFORM
* GENERATE_ARRAY
* GENERATE_DATE_ARRAY
* JSON_ARRAY
* JSON_QUERY_ARRAY
* JSON_VALUE_ARRAY
* Funciones JSON
* Overview
* BOOL
* BOOL_ARRAY
* FLOAT64
* FLOAT64_ARRAY
* FLOAT32
* FLOAT32_ARRAY
* INT64
* INT64_ARRAY
* JSON_ARRAY
* JSON_ARRAY_APPEND
* JSON_ARRAY_INSERT
* JSON_CONTAINS
* JSON_OBJECT
* JSON_QUERY
* JSON_QUERY_ARRAY
* JSON_REMOVE
* JSON_SET
* JSON_STRIP_NULLS
* JSON_TYPE
* JSON_VALUE
* JSON_VALUE_ARRAY
* LAX_BOOL
* LAX_FLOAT64
* LAX_INT64
* LAX_STRING
* PARSE_JSON
* SAFE_TO_JSON
* STRING (JSON)
* STRING_ARRAY
* TO_JSON
* TO_JSON_STRING
* Funciones matemáticas
* Overview
* ABS
* ACOS
* ACOSH
* APPROX_COSINE_DISTANCE
* APPROX_DOT_PRODUCT
* APPROX_EUCLIDEAN_DISTANCE
* ASIN
* ASINH
* ATAN
* ATAN2
* ATANH
* CEIL
* CEILING
* COS
* COSH
* COSINE_DISTANCE
* DIV
* DOT_PRODUCT
* EXP
* EUCLIDEAN_DISTANCE
* FLOOR
* GREATEST
* IEEE_DIVIDE
* IS_INF
* IS_NAN
* LEAST
* LN
* REGISTRO
* LOG10
* MOD
* POW
* POWER
* ROUND
* SAFE_ADD
* SAFE_DIVIDE
* SAFE_MULTIPLY
* SAFE_NEGATE
* SAFE_SUBTRACT
* SIGN
* SIN
* SINH
* SQRT
* TAN
* TANH
* TRUNC
* Funciones de red
* Overview
* NET.HOST
* NET.IP_FROM_STRING
* NET.IP_NET_MASK
* NET.IP_TO_STRING
* NET.IP_TRUNC
* NET.IPV4_FROM_INT64
* NET.IPV4_TO_INT64
* NET.PUBLIC_SUFFIX
* NET.REG_DOMAIN
* NET.SAFE_IP_FROM_STRING
* Funciones de búsqueda
* Overview
* DEBUG_TOKENLIST
* PUNTUACIÓN
* SCORE_NGRAMS
* BUSCAR
* SEARCH_NGRAMS
* SEARCH_SUBSTRING
* SNIPPET
* TOKEN
* TOKENIZE_BOOL
* TOKENIZE_FULLTEXT
* TOKENIZE_JSON
* TOKENIZE_NGRAMS
* TOKENIZE_NUMBER
* TOKENIZE_SUBSTRING
* TOKENLIST_CONCAT
* Funciones de cadena
* Overview
* BYTE_LENGTH
* CHAR_LENGTH
* CHARACTER_LENGTH
* CODE_POINTS_TO_BYTES
* CODE_POINTS_TO_STRING
* CONCAT
* ENDS_WITH
* FORMAT
* FROM_BASE32
* FROM_BASE64
* FROM_HEX
* LCASE
* LENGTH
* MENOR
* LPAD
* LTRIM
* NORMALIZAR
* NORMALIZE_AND_CASEFOLD
* OCTET_LENGTH
* REGEXP_CONTAINS
* REGEXP_EXTRACT
* REGEXP_EXTRACT_ALL
* REGEXP_REPLACE
* REPETIR
* SUSTITUIR
* REVERSE
* RPAD
* RTRIM
* SAFE_CONVERT_BYTES_TO_STRING
* SOUNDEX
* SPLIT
* SPLIT_SUBSTR
* STARTS_WITH
* STRPOS
* SUBSTR
* SUBSTRING
* TO_BASE32
* TO_BASE64
* TO_CODE_POINTS
* TO_HEX
* TRIM
* UPPER
* UCASE
* Funciones de marcas de tiempo
* Overview
* CURRENT_TIMESTAMP
* EXTRACT (marca de tiempo)
* FORMAT_TIMESTAMP
* PARSE_TIMESTAMP
* PENDING_COMMIT_TIMESTAMP
* STRING (marca de tiempo)
* TIMESTAMP
* TIMESTAMP_ADD
* TIMESTAMP_DIFF
* TIMESTAMP_MICROS
* TIMESTAMP_MILLIS
* TIMESTAMP_SECONDS
* TIMESTAMP_SUB
* TIMESTAMP_TRUNC
* UNIX_MICROS
* UNIX_MILLIS
* UNIX_SECONDS - Funciones de MySQL
* Todas las funciones de MySQL
* Funciones de fecha y hora
* Overview
* DATE_FORMAT
* DÍA
* DAYNAME
* DAYOFMONTH
* DAYOFWEEK
* DAYOFYEAR
* FROM_DAYS
* FROM_UNIXTIME
* HORA
* MAKEDATE
* MICROSECOND
* MINUTO
* MES
* MONTHNAME
* PERIOD_ADD
* PERIOD_DIFF
* TRIMESTRE
* SECOND
* STR_TO_DATE
* SYSDATE
* HORA
* TO_DAYS
* TO_SECONDS
* UNIX_TIMESTAMP
* UTC_DATE
* UTC_TIMESTAMP
* SEMANA
* WEEKDAY
* WEEKOFYEAR
* AÑO
PostgreSQL
- Descripción general de PostgreSQL
- Estructura léxica y sintaxis
- Definición de datos (DDL)
- Manipulación de datos (DML)
- Sintaxis de consulta
- Subconsultas
- Tipos de datos
- Funciones
- Operadores
- Procedimientos almacenados
- Tablas del catálogo del sistema de PostgreSQL
- Vistas del catálogo del sistema PostgreSQL
- Problemas conocidos en la interfaz de PostgreSQL
GQL en Spanner
Instrucciones de consulta
Patrones
Operadores
Funciones
- Introducción
- Función DESTINATION_NODE_ID
- Función BORDES
- Función ELEMENT_DEFINITION_NAME
- Función ELEMENT_ID
- Función ES_ACÍCLICO
- Función IS_FIRST
- Función IS_TRAIL
- Función ETIQUETAS (LABELS)
- Función NODES
- Función PATH
- Función PATH_FIRST
- Función PATH_LAST
- Función PATH_LENGTH
- Función PROPERTY_NAMES
- Función SOURCE_NODE_ID
CLI
GoogleSQL data definition language
Use the GoogleSQL data definition language (DDL) to do the following:
- Create and alter a database.
- Create and drop a placement.
- Create, alter, or drop a locality group.
- Create, alter, or drop tables in a database.
- Add, alter, or drop columns in a table.
- Create, alter, or drop indexes in a database.
- Create, alter, or drop search indexes in a database.
- Create, replace, or drop views in a database.
- Create, alter, or drop change streams in a database.
- Create or drop database roles.
- Grant privileges to database roles.
- Grant database roles to other database roles.
- Create, alter, or drop ML models in a database.
Notation
- Square brackets "[ ]" indicate optional clauses.
- Parentheses "( )" indicate literal parentheses.
- The vertical bar "|" indicates a logical OR.
- Curly braces "{ }" enclose a set of options.
- A comma followed by an ellipsis indicates that the preceding item can repeat in a comma-separated list.
item [, ...]indicates one or more items, and[item, ...]indicates zero or more items. - A comma "," indicates the literal comma.
- Angle brackets "<>" indicate literal angle brackets.
- An mdash "—" indicates a range of values between the items on either side of it.
- The plus sign "+" indicates that the preceding item can repeat.
Reserved keywords
Some words have special meaning in the GoogleSQL language and are reserved in its DDL. To use a reserved keyword as an identifier in your schema, enclose it in backticks (`). For the full list of reserved keywords in GoogleSQL, see GoogleSQL lexical structure and syntax.
For example:
CREATE TABLE MyTable (
RowId INT64 NOT NULL PRIMARY KEY,
`Order` INT64
);
Names
The following rules apply to database IDs.
- Must start with a lowercase letter.
- Can contain lowercase letters, numbers, underscores, and hyphens, but not uppercase letters.
- Cannot end with an underscore or hyphen.
- Must be enclosed in backticks (
`) if it's a reserved word or contains a hyphen. - Can be between 2-30 characters long.
- Cannot be changed after you create it.
The following rules apply to names for schemas, tables,change streams, columns, constraints, indexes, roles,sequences, and views:
- Must be at least one character long.
- Can contain a maximum of 128 characters.
- Must start with an uppercase or lowercase letter.
- Can contain uppercase and lowercase letters, numbers, and underscores, but not hyphens.
- Spanner objects can't be created with the same name as another object in the same database, including names that only differ in capitalization. For example, the second statement in the following snippet fails because the table names differ only by case.
CREATE TABLE MyTable (col1 INT64 PRIMARY KEY);
CREATE TABLE MYTABLE (col1 INT64 PRIMARY KEY); The following snippet fails because two different objects use the same name:
CREATE TABLE MyTable (col1 INT64 PRIMARY KEY);
CREATE SCHEMA MyTable; - When referring to other schema objects in a DDL statement (for example, a column name for a primary key, or table and column names in an index), make sure to use the original case for the name of each entity. As an example, consider the table
Singerscreated with the following statement.
CREATE TABLE Singers (
SingerId INT64 NOT NULL PRIMARY KEY,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo BYTES(MAX),
BirthDate DATE
); The following command fails with the message Table not found: singersbecause it uses a different case for the Singers table.
CREATE INDEX SingersByFirstLastName ON singers(FirstName, LastName) - Schema object names are case insensitive in SQL queries. As an example, consider the table
MyTable2created with the following statement.
CREATE TABLE MyTable2 (col1 INT64 PRIMARY KEY); The following queries all succeed because schema object names are case-insensitive for queries.
SELECT col1 FROM MyTable2 LIMIT 1;
SELECT COL1 FROM MYTABLE2 LIMIT 1;
SELECT COL1 FROM mytable2 LIMIT 1;
INSERT INTO MYTABLE2 (col1) VALUES(1); - When a column name in a table is identical to the table name, the table must use an alias for the query to work. As an example, consider the table
Singercreated with the following statement.
CREATE TABLE Singer (
Singer INT64 NOT NULL PRIMARY KEY,
FirstName STRING(1024),
LastName STRING(1024),
BirthDate DATE
); The following query succeeds because the table uses an alias when the table name is identical to the column name.
SELECT S.FirstName, S.Singer FROM Singer S; Data types
The following are the data types used in GoogleSQL.
Scalars
The syntax for using a scalar type in DDL is:
{ BOOL | INT64 | FLOAT32 | FLOAT64 | NUMERIC | STRING( length ) | JSON | BYTES( length ) | DATE | TIMESTAMP }
length: { int64value | MAX }
int64value: { decimalvalue | hexvalue }
decimalvalue: [-]0—9+
hexvalue: [-]0x{0—9|a—f|A—F}+
An int64_value must correspond to an integer from -9,223,372,036,854,775,808 (-263) to 9,223,372,036,854,775,807 (263 − 1). It can be specified with decimal or hexadecimal notation. The hexadecimal form requires a0x prefix, with a lowercase x.
STRING
STRING is a variable length Unicode character string. Its value must be a valid Unicode string. Length is required, and represents the maximum number of Unicode characters (not bytes) that can be stored in the field.
Notes:
- Writes to the column are rejected if the new value is not a valid Unicode string or exceeds the specified length.
lengthcan be an integer in the range [1, 2621440].- For a field whose length is unpredictable or does not need to be constrained, you can set
lengthto the convenience valueMAX, which is equivalent to 2621440 for validation purposes.
Only the actual length of the stored string impacts storage costs; specifyingMAXdoes not use any additional storage capacity. - GoogleSQL requires Unicode strings to be UTF-8 encoded on receipt at the server.
- Collation is done by Unicode character numerical value (technically by code point, which is subtly different due tocombining characters). For ASCII strings, this is the standard lexicographical sort order.
- You can reduce the length of a column after the table has been created, but doing so requires Spanner tovalidatethat the existing data is within the length constraint.
JSON
JSON is a variable length Unicode character string representing a JSON object. The string must be UTF-8 encoded on receipt at the server. The maximum length of the JSON value is 10 MB.
See Working with JSON andData types For more information.
BYTES
BYTES is a variable length binary string. Length is required, and represents the maximum number of bytes that can be stored in the field.
Notes:
- Writes to the column are rejected if the new value exceeds the specified length.
lengthcan be an integer in the range [1, 10485760] or the convenience valueMAX, which is equivalent to 10485760 for validation purposes.
Only the actual stored bytes impact storage costs; specifyingMAXdoes not use any additional storage capacity.- You can reduce the length of a column after the table has been created, but doing so requires Spanner tovalidatethat the existing data is within the length constraint.
DATE
- A timezone-independent date.
- The range [
0001-01-01, 9999-12-31] is the legal interval for dates. A write to a date column is rejected if the value is outside of that interval. - For more information and to see the canonical format, seeData Types.
TIMESTAMP
- A timestamp with nanosecond precision.
- Timezone-independent, over the range [
0001-01-01 00:00:00to10000-01-01 00:00:00]. - For more information and to see the canonical format, seeData Types.
Arrays
The syntax for using the ARRAY type in DDL is:
ARRAY<scalartype**> [(vector_length=>vectorlengthvalue**)]
GoogleSQL supports arrays of scalars. The primary purpose of arrays is to store a collection of values in a space efficient way. Arrays are not designed to provide access to individual elements; to read or write a single element, you must read or write the entire array.
If your application uses data structures like vectors or repeated fields, you can persist their state in a GoogleSQL array.
Here's an example of an alternate definition of Singers that uses multiple columns of ARRAY type:
CREATE TABLE Singers ( SingerId INT64, FeaturedSingerIds ARRAY, SongNames ARRAY<STRING(MAX)> ) PRIMARY KEY (SingerId) ...;
Notes:
- Arrays with subtype
ARRAY(nested arrays) are not supported. - Arrays, like scalar values, can never be larger than 10 MiB total.
- Arrays can't be used as key columns.
- In a
CREATE TABLEstatement, you can create columns ofARRAYtype with aNOT NULLannotation.
After you create the table, you cannot add a column ofARRAYtype with aNOT NULLannotation, and you cannot add aNOT NULLannotation to an existing column ofARRAYtype. vector_lengthsets an array column to a fixed size for use in a vector search. The value must be an integer greater than or equal to zero. You can only use this parameter with an array that uses theFLOAT32orFLOAT64data types. That is,ARRAY<FLOAT32> (vector_length=>INT)orARRAY<FLOAT64> (vector_length=>INT). Setting an array withvector_lengthis required to perform approximate nearest neighborsvector search. It can also provide performance benefits when performingK-nearest neighbors vector search. You can create this array column and set its value usingCREATE TABLE. You can alter this array column usingALTER TABLE.
Protocol buffers
The syntax for using the protocol buffers (PROTO) data type in DDL is:
prototypename;
GoogleSQL supports PROTO and arrays of PROTO. Protocol buffers are a flexible, efficient mechanism for serializing structured data. For more information, see Work with protocol buffers in GoogleSQL.
The following is an example of a table named Singers with a SingerInfo proto message column and an SingerInfoArray proto message array column:
CREATE TABLE Singers (
SingerId INT64 NOT NULL PRIMARY KEY,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo googlesql.example.SingerInfo,
SingerInfoArray ARRAY<googlesql.example.SingerInfo>,
);
It has the following definition of the SingerInfo proto type:
package googlesql.example;
message SingerInfo {
optional string nationality = 1;
repeated Residence residence = 2;
message Residence {
required int64 start_year = 1;
optional int64 end_year = 2;
optional string city = 3;
optional string country = 4;
}
}
SCHEMA statements
This section has information about the CREATE SCHEMA and DROP SCHEMAstatements.
CREATE SCHEMA
Creates a new schema and assigns a name.
CREATE SCHEMA [schema_name]
Parameters
**_schemaname_**
- Contains a name for a schema.
- When querying data, use fully qualified names (FQNs) to specify objects that belong to a specific schema. FQNs combine the schema name and the object name to identify database objects. For example,
products.albumsfor theproductsschema andalbumstable. For more information, seeNamed schemas.
DROP SCHEMA
Removes a named schema.
DROP SCHEMA schema_name
Parameters
**_schemaname_**
- Contains the name for the schema to drop.
Parameters
**_schemaname_**
- Contains the name of the schema that you want to drop.
DATABASE statements
This section has information about the CREATE DATABASE and ALTER DATABASEstatements.
CREATE DATABASE
When creating a GoogleSQL database, you must provide a CREATE DATABASEstatement, which defines the ID of the database:
CREATE DATABASE databaseid
where databaseid {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}
Parameters
**_databaseid_**
- The name of the database to create. See Names.
ALTER DATABASE
Changes the definition of a database.
Syntax
ALTER DATABASE databaseid action
where databaseid is: {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}
and action is: SET OPTIONS ( options_def [, ... ] )
and optionsdef is: { default_leader = { 'region' | null } | optimizer_version = { 1 ... 8 | null } | optimizer_statistics_package = { 'packagename' | null } | version_retention_period = { 'duration' | null } | default_sequence_kind = { 'bitreversedpositive' | null } | default_time_zone = { 'timezonename' | null } | read_lease_regions = {'readleaseregionname [, ... ]' | null } | columnar_policy = {'columnarpolicy' | null } }
Description
ALTER DATABASE changes the definition of an existing database.
SET OPTIONS
- Use this clause to set an option at the database level of the schema hierarchy.
Parameters
**_databaseid_**
- The name of the database whose attributes are to be altered. If the name is a reserved word or contains a hyphen, enclose it in backticks (
`). For information on database naming rules, see Names.
**_optionsdef_**
- The
optimizer_version = { 1 ... 8 | null }option lets you specify the query optimizer version to use. Setting this option tonullis equivalent to setting it to the default version. For more information, see Query Optimizer. - The
optimizer_statistics_package = { '**_packagename_**' | null }option lets you specify the query optimizer statistics package name to use. By default, this is the latest collected statistics package, but you can specify any available statistics package version. Setting this option tonullis equivalent to setting it to the latest version. For more information, see Query statistics package versioning. - The
version_retention_period = { 'duration' | null }is the period for which Spanner retains all versions of data and schema for the database. The duration must be in the range[1h, 7d]and can be specified in days, hours, minutes, or seconds. For example, the values1d,24h,1440m, and86400sare equivalent. Setting the value tonullresets the retention period to the default, which is 1 hour. This option can be used for point-in-time recovery. For more information, see Point-in-time Recovery. - The
default_leader = { 'region' | null }sets the leader region for your database. You can only use this parameter for databases that use a multi-region configuration.default_leadermust be set tonull, or one of the read-write replicas in your multi-region configuration.nullresets the leader region to the default leader region for your database's multi-region configuration. For more information, see Configuring the default leader region. - The
default_sequence_kind = { 'bit_reversed_positive' | null }sets the default sequence kind for your database.**_bitreversedpositive_**is the only valid sequence kind. Thebit_reversed_positiveoption specifies that the values generated by the sequence are of typeINT64, are greater than zero, and aren't sequential. You don't need to specify a sequence type when usingdefault_sequence_kind. When you usedefault_sequence_kindfor a sequence or identity column, you can't change the sequence kind later. For more information, see Primary key default values management. - The
use_unenforced_foreign_key_for_query_optimization = { true | false | null }lets you specify whether the query optimizer can rely oninformational foreign key relationshipsto improve query performance. For example, the optimizer can remove redundant scans, and push someLIMIToperators through the join operators. Settinguse_unenforced_foreign_key_for_query_optimizationtonullis equivalent to setting it totrue. Note that enabling this might lead to incorrect results if the data is inconsistent with the foreign key relationships. - The
default_time_zone = { 'time_zone_name' | null }option sets the default time zone for your database. If set toNULL, the system defaults toAmerica/Los_Angeles. Specifying a time zone within aDATEorTIMESTAMPfunction overrides this setting. Thetime_zone_namemust be a valid entry from the IANA Time Zone Database. This option can only be set on empty databases without any tables. - The
read_lease_regions = {'read_lease_region_name' | null }option sets theread lease region for your database. By default, or when set toNULL, the database doesn't use any read lease regions. If you set one or more read lease regions for your database, Spanner gives the right to serve reads locally to one or more non-leader, read-write, or read-only regions. This allows the non-leader regions directly serve strong reads and reduce strong read latency. - The
columnar_policy = {'columnar_policy' | null }option sets the columnar policy for the database. By default, or when set toNULL, no data will be written in columnar format unless enabled on a more specific schema object, such as a table or index. For more information about how to configure columnar, see Configure Spanner columnar engine.
LOCALITY GROUP statements
This section has information about the CREATE LOCALITY GROUP,ALTER LOCALITY GROUP, and DROP LOCALITY GROUP statements.
CREATE LOCALITY GROUP
Use the CREATE LOCALITY GROUP statement to define a locality group to store some columns separately or to use tiered storage. For more information, see Locality groupsand Tiered storage overview.
Syntax
CREATE LOCALITY GROUP localitygroupname [ storagedef ]
where storagedef is: { OPTIONS ( storage = '{ ssd | hdd }' [, ssd_to_hdd_spill_timespan='duration' ] ) }
Description
CREATE LOCALITY GROUP defines a new locality group in the current database.
Parameters
**_localitygroupname_**
- The name of the locality group.
**OPTIONS**
- Use
**_storage_**to define the storage type of the locality group. You can set the storage type as 'ssd' or 'hdd'. - Use
**_ssdtohddspilltimespan_**to define the amount of time that data is stored in SSD storage before it moves to HDD storage. After the specified time passes, Spanner migrates the data to HDD storage during its normal compaction cycle, which typically occurs over the course of seven days from the specified time. The duration must be at least one hour (1h) and at most 365 days (365d) long. It can be specified in days, hours, minutes, or seconds. For example, the values1d,24h,1440m, and86400sare equivalent.
ALTER LOCALITY GROUP
Use the ALTER LOCALITY GROUP statement to change the storage option or age-based policy of a locality group.
Syntax
ALTER LOCALITY GROUP localitygroupname [ storagedef ]
where storagedef is: { SET OPTIONS ( [ storage = '{ ssd | hdd }' ssd_to_hdd_spill_timespan='duration' ] ) }
Description
ALTER LOCALITY GROUP changes the storage option or age-based policy of a locality group. You can change these options together or individually.
Parameters
**_localitygroupname_**
- The name of the locality group. When updating the
defaultlocality group,defaultmust be within backticks (`default`). You only need to include the backticks for thedefaultlocality group.
**OPTIONS**
- Use
**_storage_**to define the new storage type of the locality group. - Use the
ssd_to_hdd_spill_timespan = 'duration'option to set the new age-based policy of the locality group. The duration must be at least one hour (1h) and at most 365 days (365d) long. It can be specified in days, hours, minutes, or seconds. For example, the values1d,24h,1440m, and86400sare equivalent.
DROP LOCALITY GROUP
Use the DROP LOCALITY GROUP statement to drop the locality group. You can't drop a locality group if it contains data. You must first move all data that's in the locality group to another locality group.
Syntax
DROP LOCALITY GROUP localitygroupname
Description
DROP LOCALITY GROUP drops the locality group.
PLACEMENT statements
This section has information about PLACEMENT statements.
CREATE PLACEMENT
Use the CREATE PLACEMENT statement to define a placement to partition row data in your database. For more information, see theGeo-partitioning overview.
Syntax
CREATE PLACEMENT placementname [ partitiondef ]
where partitiondef is: { OPTIONS ( instance_partition="partitionid" [, default_leader="leaderregionid" ] [, read_lease_regions = {'readleaseregionname[, ... ]' | null } ] ) }
Description
CREATE PLACEMENT defines a new placement in the current database.
Parameters
**_placementname_**
- The name of the placement.
**_partitionid_**
- The unique identifier of the user-created partition associated with the placement.
**_leaderregionid_**
- This optional parameter sets the default leader region for the partition. Similar to setting the default leader at the database level. However, this only applies to the partition.
- The
read_lease_regions = {'read_lease_region_name' | null }option sets one or more read lease regions for your placement. By default, or when set toNULL, the placement doesn't use any read lease regions. If you set one or more read lease regions for your placement, Spanner gives the right to serve reads locally to one or more non-leader, read-write, or read-only regions. This lets the non-leader regions directly serve strong reads and reduce strong read latency.
DROP PLACEMENT
Use the DROP PLACEMENT statement to delete a placement.
Syntax
DROP PLACEMENT placementname
Description
DROP PLACEMENT drops a placement.
Parameters
**_placementname_**
- The name of the placement to drop.
PROTO BUNDLE statements
The PROTO files you create need to be loaded into your database schema usingPROTO BUNDLE, making the PROTO files available for use by tables and queries keyed by PROTO and ENUM fields.
CREATE PROTO BUNDLE
Use the CREATE PROTO BUNDLE statement to load types available from imported proto files into the schema.
Syntax
CREATE PROTO BUNDLE ("
(<proto_type_name>) ("," <proto_type_name>)*
")
Description
CREATE PROTO BUNDLE loads types available from imported proto files.
Parameters
prototypename
- The proto types included in your
PROTO BUNDLE.
Notes:
- Spanner requires some proto types to be included in your
PROTO BUNDLE. In particular:- Any message type that is used as the type of a
PROTOcolumn. - Any enum type that is used by an
ENUMcolumn. - Any type needed to resolve a proto field path.
- Any enum type that is referenced by a message type in the
PROTO BUNDLE. - Any message type that nests a message or enum type already in the
PROTO BUNDLE. - Any nested message type that is used as the type of a
PROTOcolumn.
- Any message type that is used as the type of a
- If you're using a protocol buffer type and any part of the type name is a Spanner reserved keyword, enclose the entire protocol buffer type name in backticks. For example, if you created a message named
Bytesin the packagemy.awesome.proto, and you wanted to create a column of that type, you can use the column definition:MyColumn my.awesome.proto.Bytes.
ALTER PROTO BUNDLE
The ALTER PROTO BUNDLE statement is used to update the proto information stored in the schema.
Syntax
ALTER PROTO BUNDLE
[ INSERT ( <proto_type_name> , .... ) ]
[ UPDATE ( <proto_type_name> , .... ) ]
[ DELETE ( <proto_type_name> , .... ) ]
Description
ALTER PROTO BUNDLE updates the proto information already stored in the schema.
Parameters
prototypename
- The proto types included in your
PROTO BUNDLE.
Notes:
- All the same notes that apply to CREATE PROTO BUNDLEapply to
ALTER PROTO BUNDLE, but they apply to the final proto bundle, not the alteration itself. INSERT,UPDATE, andDELETEclauses all execute atomically as a single change to your database's type information.
DROP PROTO BUNDLE
The DROP PROTO BUNDLE statement is used to drop all proto type information stored in the schema.
Syntax
DROP PROTO BUNDLE
Description
DROP PROTO BUNDLE drops all proto type information stored in the schema.
Notes:
- All the same notes that apply to
CREATE PROTO BUNDLEapply toDROP PROTO BUNDLE. You can't drop a proto bundle if your database uses types in the proto bundle.
TABLE statements
This section has information about the CREATE TABLE, ALTER TABLE,DROP TABLE, AND RENAME TABLE statements.
CREATE TABLE
Defines a new table.
Syntax
CREATE TABLE [ IF NOT EXISTS ] tablename ( [ { columnname datatype [NOT NULL] [ { DEFAULT ( expression ) [ ON UPDATE ( expression )] | AS ( expression ) [ STORED ] | GENERATED BY DEFAULT AS IDENTITY [ ( sequenceoptionclause ... ) ] | AUTO_INCREMENT } ] [ HIDDEN ] [ PRIMARY KEY ] [ OPTIONS ( columnoptionsdef [ , ... ] ) ] | locationname STRING(MAX) NOT NULL PLACEMENT KEY | tableconstraint | synonymdefinition } [, ... ] ] ) [ PRIMARY KEY ( [columnname [ { ASC | DESC } ], ...] ) ] [, INTERLEAVE IN [PARENT] tablename [ ON DELETE { CASCADE | NO ACTION } ] ] [, ROW DELETION POLICY ( OLDER_THAN ( timestampcolumn, INTERVAL numdays DAY ) ) ] [, OPTIONS ( tableoptionsdef [ , ... ] ) ]
where datatype is: { scalar_type | array_type | proto_type_name }
and columnoptionsdef is: { allow_commit_timestamp = { true | null } | locality_group = 'localitygroupname' }
and tableconstraint is: [ CONSTRAINT constraintname ] { CHECK ( expression ) | FOREIGN KEY ( columnname [, ... ] ) REFERENCES reftable ( refcolumn [, ... ] ) [ ON DELETE { CASCADE | NO ACTION } ] [ { ENFORCED | NOT ENFORCED } ] }
and synonymdefinition is: [ SYNONYM (synonym) ]
and sequenceoptionclause is: { BIT_REVERSED_POSITIVE | SKIP RANGE skiprangemin, skiprangemax | START COUNTER WITH startwithcounter }
and tableoptionsdef is: { locality_group = 'localitygroupname' | columnar_policy = 'columnarpolicy' | fulltext_dictionary_table = { true | false | null } | fulltext_dictionary_staleness = 'staleness' }
Description
CREATE TABLE defines a new table in the current database.
Parameters
IF NOT EXISTS
- If a table exists with the same name, the
CREATEstatement has no effect and no error is generated.
**_tablename_**
- The name of the table to be created. For naming rules, see Names.
**_columnname_**
- The name of a column to be created. For naming rules, see Names.
**_datatype_**
**_vectorlength_**
vector_lengthsets an array column to a fixed size for use in a vector search. The value must be an integer greater than or equal to zero. You can only use this parameter with an array that uses theFLOAT32orFLOAT64data types. That is,ARRAY<FLOAT32> (vector_length=>INT)orARRAY<FLOAT64> (vector_length=>INT). It isn't supported for aDEFAULTor generated column.
**_timestampcolumn_**
- The name of a column of type
TIMESTAMP, that is also specified in the CREATE TABLE statement.
**_numdays_**
- The number of days after the date in the specified
timestamp_column, after which the row is marked for deletion. Valid values are non-negative integers.
NOT NULL
- This optional column annotation specifies that the column is required for all mutations that insert a new row.
- You cannot add a NOT NULL column to an existing table. For most column types, you can work around this limitation:
- For columns of
ARRAYtype, the only time you can use a NOT NULL annotation is when you create the table. After that, you cannot add a NOT NULL annotation to a column ofARRAYtype. - For all other column types, you can add a nullable column; fill that column by writing values to all rows; and update your schema with a NOT NULL annotation on that column.
- For columns of
HIDDEN
Hides a column if it shouldn't appear in SELECT * statements. If the column is hidden, you can still select it using its name. For example,SELECT Id, Name, ColHidden FROM TableWithHiddenColumn.
The primary use case for HIDDEN columns is to omit TOKENLIST columns from a SELECT * statement.
DEFAULT ( **_expression_** )
- This clause sets a default value for the column.
- A column with a default value can be a key or non-key column.
- A column can't have a default value and also be a generated column.
- You can insert your own value into a column that has a default value, overriding the default value. You can also reset a non-key column to its default value by using
UPDATE ... SET**_column-name_**= DEFAULT. - A generated column or a check constraint can depend on a column with a
default value. - A column can only use
PENDING_COMMIT_TIMESTAMPas a default value if it has theALLOW_COMMIT_TIMESTAMPtype (this is the only default value allowed for this type). **_expression_**can be a literal or any valid SQL expression that is assignable to the column data type, with the following properties and restrictions:- The expression can be non-deterministic.
- The expression can't reference other columns.
- The expression can't contain subqueries, query parameters, aggregates, or analytic functions.
ON UPDATE ( **_expression_** )
- This clause configures a column to automatically update its value whenever a row is modified. This is typically used to maintain "last updated" timestamps without requiring manual input in every
UPDATEstatement. - The column is set to the result of the expression whenever an update occurs on any non-key column in the row.
- The expression is triggered even if the update statement sets a column to its current value (that is, no actual data change occurs).
- You can bypass the automated value by explicitly providing a value for the column within your UPDATEor INSERTstatement.
- To use the
ON UPDATEclause, the column must satisfy these conditions:- Must not be part of the table’s
PRIMARY KEY. - Must have a
DEFAULTexpression that is identical to theON UPDATEexpression. - Must be a commit timestamp column, and the expression must be one of the following, depending on the column's data type:
*PENDING_COMMIT_TIMESTAMP()(forTIMESTAMPcolumns)
*PENDING_COMMIT_TIMESTAMP_INT64()(forINT64columns)
- Must not be part of the table’s
GENERATED BY DEFAULT AS IDENTITY [ ( sequence_option_clause ... )]
- This clause auto-generates integer values for the column.
BIT_REVERSED_POSITIVEis the only valid type.- An identity column can be a key or non-key column.
- An identity column can't have a default value or be a generated column.
- You can insert your own value into an identity column. You can also reset a non-key column to use generated value by using
UPDATE ... SET**_column-name_**= DEFAULT. - A generated column or a check constraint can depend on an identity column.
- An identity column accepts the following option clauses:
BIT_REVERSED_POSITIVEindicates the type of identity column.SKIP RANGE**_skiprangemin_**,**_skiprangemax_**allows the underlying sequence to skip the numbers in this range when callingGET_NEXT_SEQUENCE_VALUE. The skipped range is an integer value and inclusive. The accepted values forskip_range_minis any value that is less than or equal toskip_range_max. The accepted values forskip_range_maxis any value that is greater than or equal toskip_range_min.START COUNTER WITH**_startwithcounter_**is a positiveINT64value that Spanner uses to set the next value for the internal sequence counter. For example, when Spanner obtains a value from the bit-reversed sequence, it begins withstart_with_counter. Spanner bit reverses this value before returning it. The default value is1.
AS ( **_expression_** ) [STORED]
- This clause creates a column as a generated column, which is a column whose value is defined as a function of other columns in the same row.
**_expression_**can be any valid SQL expression that's assignable to the column data type with the following restrictions.- The expression can only reference columns in the same table.
- The expression can only use immutable functions. An immutable function is one that returns the same results every time it's called with the same argument values. For more information, seeFunction volatility.
- The expression must be scalar, meaning it returns a single value.
- The expression can't contain subqueries.
- You can't modify the expression of a
STOREDor indexed generated column.
- For GoogleSQL-dialect databases, a non-stored generated column of type
STRINGorBYTESmust have a length ofMAX. - For PostgreSQL-dialect databases, a non-stored, or virtual, generated column of type
VARCHARmust have a length ofMAX. - The
STOREDattribute that follows the expression stores the result of the expression along with other columns of the table. Subsequent updates to any of the referenced columns cause Spanner to re-evaluate and store the expression. - Generated columns that are not
STOREDcan't be marked asNOT NULL. - Direct writes to generated columns aren't allowed.
- Column option
allow_commit_timestampisn't allowed on generated columns or any columns that generated columns reference. - For
STOREDor generated columns that are indexed, you can't change the data type of the column, or of any columns that the generated column references. - You can't drop a column a generated column references.
- You can use a generated column as a primary key with the following additional restrictions:
- The generated primary key can't reference other generated columns.
- The generated primary key can reference, at most, one non-key column.
- The generated primary key can't depend on a non-key column with a
DEFAULTclause.
- The following rules apply when using generated key columns:
- Read APIs: You must fully specify the key columns, including the generated key columns.
- Mutation APIs: For
INSERT,INSERT_OR_UPDATE, andREPLACE, Spanner doesn't allow you to specify generated key columns. ForUPDATE, you can optionally specify generated key columns. ForDELETE, you need to fully specify the key columns including the generated keys. - DML: You can't explicitly write to generated keys in
INSERTorUPDATEstatements. - Query: In general, we recommend that you use the generated key column as a filter in your query. Optionally, if the expression for the generated key column uses only one column as a reference, the query can apply an equality (
=) orINcondition to the referenced column. For more information and an example, seeCreate a unique key derived from a value column.
For examples on how to work with generated columns, seeCreating and managing generated columns.
AUTO_INCREMENT
- This clause creates a column as an identity column, which is a column whose value is generated by a sequence. To use
AUTO_INCREMENT, the database optiondefault_sequence_kindmust be explicitly set.
For examples of how to work with AUTO_INCREMENT, seePrimary key default values management.
**_locationname_** STRING(MAX) NOT NULL PLACEMENT KEY
**_locationname_**: The name of the column.PLACEMENT KEYis the required attribute that defines this column as the column that contains the placement information for rows in this table.
PRIMARY KEY in column definition orPRIMARY KEY ( [ **_columnname_** [ { ASC | DESC } ], ...]in table definition
- Every table must have a primary key and that primary key can be composed of zero or more columns of that table.
- A single-column primary key can be defined either inline within the column definition or at the table-level.
- A zero or multi-column primary key must be defined at the table-level with the
PRIMARY KEY ( [**_columnname_**[ { ASC | DESC } ], ...]syntax. - A primary key can't be defined at both the column and table-level.
- Adding the
DESCannotation on a primary key column name changes the physical layout of data from ascending order (default) to descending order. TheASCorDESCoption can be specified only when defining the primary key at the table-level.
For more details, see Schema and data model.
[, INTERLEAVE IN PARENT **_tablename_** [ ON DELETE { CASCADE | NO ACTION } ] ]
INTERLEAVE IN PARENTdefines a child-to-parent table relationship, which results in a physical interleaving of parent and child rows. The primary-key columns of a parent must positionally match, both in name and type, a prefix of the primary-key columns of any child. Adding rows to the child table fails if the corresponding parent row does not exist. The parent row can either exist in the database or be inserted before the insertion of the child rows in the same transaction.- The optional
ON DELETEclause is only allowed forINTERLEAVE IN PARENT.ON DELETEdefines the behavior of rows inChildTablewhen a mutation attempts to delete the parent row. The supported options are:CASCADE: the child rows are deleted.NO ACTION: the child rows are not deleted. If deleting a parent would leave behind child rows, thus violating parent-child referential integrity, the write will fail.
You can omit theON DELETEclause, in which case the default ofON DELETE NO ACTIONis used.
For more details, see Schema and data model.
INTERLEAVE IN **_parenttablename_**
INTERLEAVE INdefines the same parent-child relationship and physical interleaving of parent and child rows asINTERLEAVE IN PARENT, but the parent-child referential integrity constraint isn't enforced. Rows in the child table can be inserted before the corresponding rows in the parent table. Like withIN PARENT, the primary-key columns of a parent must positionally match, both in name and type, a prefix of the primary-key columns of any child.
CONSTRAINT **_constraintname_**
- An optional name for a table constraint. If a name is not specified, Spanner generates a name for the constraint. Constraints names, including generated names, can be queried from the Spannerinformation schema.
CHECK ( **_expression_** )
- A
CHECKconstraint lets you specify that the values of one or more columns must satisfy a boolean expression. expressioncan be any valid SQL expression that evaluates to aBOOL.- The following restrictions apply to a check constraint
expressionterm.- The expression can only reference columns in the same table.
- The expression must reference at least one non-generated column, whether directly or through a generated column which references a non-generated column.
- The expression can't reference columns that have set the
allow_commit_timestampoption. - The expression can't contain subqueries.
- The expression can't contain non-deterministic functions, such asCURRENT_DATE()andCURRENT_TIMESTAMP().
- For more information, see Creating and managing check constraints.
FOREIGN KEY ( **_columnname_** [, ... ] ) REFERENCES **_reftable_** ( **_refcolumn_** [, ... ] [ ON DELETE { CASCADE | NO ACTION } ] [ { ENFORCED | NOT ENFORCED } ] )
- Use this clause to define a foreign key constraint. A foreign key is defined on the referencing table of the relationship, and it references the_referenced_ table. The foreign key columns of the two tables are called the_referencing_ and referenced columns, and their row values are the keys.
- Foreign key constraints can be declared with or without the enforcement clause. If you don't specify an enforcement clause, the foreign key constraint defaults to enforced.
- An enforced foreign key constraint requires that one or more columns of this table must contain only values that are in the referenced columns of the referenced table. A informational (NOT ENFORCED) foreign key constraint doesn't require this.
- When creating a foreign key, a unique constraint is automatically created on the referenced table, unless the entire primary key is referenced. If the unique constraint can't be satisfied, the entire schema change will fail.
- The number of referencing and referenced columns must be the same. Order is also significant. That is, the first referencing column refers to the first referenced column, and the second to the second.
- The referencing and referenced columns must have matching types and they must support the equality operator ('='). The columns must also be indexable. Columns of type
ARRAYare not allowed. - When you create a foreign key with the ON DELETE CASCADE action, deleting a row in the referenced table atomically deletes all rows from the referencing table that references the deleted row in the same transaction.
- If you don't specify a foreign key action, the default action is NO ACTION.
- Foreign keys can't be created on columns with the
allow_commit_timestamp=trueoption.
For more information, see Foreign keys.
**_columnoptionsdef_**
allow_commit_timestamp = { true | null }allows insert and update operations to request that Spanner write the commit timestamp of the transaction into the column. For more information, seeCommit timestamps in GoogleSQL-dialect databases.locality_group =**_localitygroupname_**stores columns together or sets a tiered storage policy. For more information, seeLocality groupsand Tiered storage overview.
**_tableoptionsdef_**
locality_group =**_localitygroupname_**stores tables together or to set a tiered storage policy. For more information, seeLocality groupsand Tiered storage overview.columnar_policy =**_columnarpolicy_**sets the columnar policy for the table. For more information, seeConfigure Spanner columnar engine.fulltext_dictionary_table = { true | false | null }specifies if the table is a custom dictionary table for full-text search. Once set, the value of this option can't be changed. This option must be set during table creation. For more information, see Custom Dictionaries.fulltext_dictionary_staleness = 'staleness'specifies the staleness allowed for the full-text search dictionary. The value must be a valid duration, for example,'5s'. For more information, see Custom Dictionaries.
[, ROW DELETION POLICY ( OLDER_THAN ( **_timestampcolumn_** , INTERVAL **_numdays_** DAY ) ) ]
- Use this clause to set a row deletion policy for this table. For more information, see Time to live (TTL).
SYNONYM (**_synonym_**)
- Defines a synonymfor a table, which is an additional name that an application can use to access the table. A table can have one synonym. You can only use a synonym for queries and DML. You can't use the synonym for DDL or schema changes. You can see the synonym in the DDL representation of the table.
ALTER TABLE
Changes the definition of a table.
Syntax
ALTER TABLE [ IF EXISTS ] tablename action
where action is: ADD SYNONYM synonym DROP SYNONYM synonym RENAME TO newtablename [, ADD SYNONYM synonym] ADD [ COLUMN ] [ IF NOT EXISTS] columnname datatype [ columnexpression ] [ columnoptionsdef ] DROP [ COLUMN ] columnname ADD tableconstraint DROP CONSTRAINT constraintname SET ON DELETE { CASCADE | NO ACTION } SET INTERLEAVE IN [ PARENT ] parenttablename [ ON DELETE { CASCADE | NO ACTION } ] ALTER [ COLUMN ] columnname { datatype [ NOT NULL ] [ { DEFAULT ( expression ) [ ON UPDATE ( expression )] | AS ( expression ) | GENERATED BY DEFAULT AS IDENTITY [ ( sequenceoptionclause ... ) ] } ] | SET OPTIONS ( columnoptionsdef [ , ... ] ) | SET DEFAULT ( expression ) | DROP DEFAULT | SET ON UPDATE ( expression ) | DROP ON UPDATE | ALTER IDENTITY { SET { SKIP RANGE skiprangemin, skiprangemax | NO SKIP RANGE } | RESTART COUNTER WITH counterrestart } } ADD ROW DELETION POLICY ( OLDER_THAN ( timestampcolumn, INTERVAL numdays DAY )) DROP ROW DELETION POLICY REPLACE ROW DELETION POLICY ( OLDER_THAN ( timestampcolumn, INTERVAL numdays DAY )) SET OPTIONS ( tableoptionsdef [ , ... ] )
and datatype is: { scalartype | arraytype }
and columnexpression is: [ NOT NULL ] [ { DEFAULT ( expression ) [ ON UPDATE ( expression )] | AS ( expression ) STORED | GENERATED BY DEFAULT AS IDENTITY [ ( sequenceoptionclause ) ] } ]
and columnoptionsdef is: allow_commit_timestamp = { true | null } | locality_group = 'localitygroupname'
and tableconstraint is: [ CONSTRAINT constraintname ] { CHECK ( expression ) | FOREIGN KEY ( columnname [, ... ] ) REFERENCES reftable ( refcolumn [, ... ] ) [ ON DELETE { CASCADE | NO ACTION } ] [ { ENFORCED | NOT ENFORCED } ] }
and tableoptionsdef is: { locality_group = 'localitygroupname' | columnar_policy = { 'columnarpolicy' | null } | fulltext_dictionary_staleness = 'staleness' }
Description
ALTER TABLE changes the definition of an existing table.
ADD SYNONYM **_synonym_**
- Adds a synonym to a table to give it an alternate name. You can use the synonym for reads, writes, queries, and for use with DML. You can't use
ADD SYNONYMwith DDL, such as to create an index. A table can have one synonym. For more information, see Add a table name synonym.
DROP SYNONYM **_synonym_**
- Removes a synonym from a table. For more information, see Remove a synonym.
RENAME TO **_newtablename_**
- Renames a table, for example, if the table name is misspelled. For more information, see Rename a table.
RENAME TO **_newtablename_** [, ADD SYNONYM **_synonym_**]
- Adds a synonym to a table so that when you rename the table, you can add the old table name to the synonym. This gives you time to update applications with the new table name while still allowing them to access the table with the old name. For more information, seeRename a table and add a synonym.
ADD COLUMN
- Adds a new column to the table, using the same syntax as
CREATE TABLE. - If you specify
IF NOT EXISTSand a column of the same name already exists, the statement has no effect and no error is generated. - You can specify
NOT NULLin anALTER TABLE...ADD COLUMNstatement if you specifyDEFAULT (**_expression_**)orAS (**_expression_**) STOREDfor the column. - If you include
DEFAULT (**_expression_**)orAS (**_expression_**) STORED, the expression is evaluated and the computed value is backfilled for existing rows. The backfill operation is asynchronous. This backfill operation happens only when anADD COLUMNstatement is issued. There's no backfill onALTER COLUMN. - The
DEFAULTclause has restrictions. See the description of this clause in[CREATE TABLE](#spanner-default-clause).
DROP COLUMN
- Drops a column from a table.
- You can't drop a column referenced by a generated column.
- Dropping a column referenced by a
[CHECK](#check%5Fconstraint)constraint is not allowed.
ADD **_tableconstraint_**
- Adds a new constraint to a table using the same syntax as
[CREATE TABLE](#create%5Ftable). - For foreign keys, the existing data is validated before the foreign key is added. If any existing constrained key doesn't have a corresponding referenced key for an enforced foreign key, or the referenced key isn't unique for a foreign key, the foreign key constraint is violated, and the
ALTERstatement fails. - Changing the enforcement or adding a foreign key action on an existing foreign key constraint isn't supported. Instead, you need to add a new foreign key constraint with the enforcement or action.
- If you don't specify a foreign key action, the default action is NO ACTION.
- If you don't specify the type of a foreign key, it defaults to an enforced foreign key.
- For
CHECKconstraints, new data is validated immediately against the constraint. A long-running process is also started to validate the existing data against the constraint. If any existing data does not conform to the constraint, the check constraint is rolled back. - The following restrictions apply to a check constraint
expressionterm.- The expression can only reference columns in the same table.
- The expression must reference at least one non-generated column, whether directly or through a generated column which references a non-generated column.
- The expression can't reference columns that have set the
allow_commit_timestampoption. - The expression can't contain subqueries.
- The expression can't contain non-deterministic functions, such asCURRENT_DATE()andCURRENT_TIMESTAMP().
DROP CONSTRAINT **_constraintname_**
- Drops the specified constraint on a table, along with any associated index, if applicable.
SET ON DELETE { CASCADE | NO ACTION }
- This alteration can be applied only on child tables of parent-child, interleaved tables relationships. For more information, see Schema and data model.
- The
ON DELETE CASCADEclause signifies that when a row from the parent table is deleted, its child rows in this table will automatically be deleted as well. Child rows are all rows that start with the same primary key. If a child table does not have this annotation, or the annotation isON DELETE NO ACTION, then you must delete the child rows before you can delete the parent row.
SET INTERLEAVE IN [ PARENT ] **_parenttablename_** [ ON DELETE { CASCADE | NO ACTION } ]
SET INTERLEAVE IN PARENTmigrates an interleaved table to useIN PARENTsemantics, which require that the parent row exist for each child row. While executing this schema change, the child rows are validated to ensure there are no referential integrity violations. If there are, the schema change fails. If noON DELETEclause is specified,NO ACTIONis the default. Note that directly migrating from anINTERLEAVE INtable toIN PARENT ON DELETE CASCADEis not supported. This must be done in two steps. The first step is to migrateINTERLEAVE INtoINTERLEAVE IN PARENT T [ON DELETE NO ACTION]and the second step is to migrate toINTERLEAVE IN PARENT T ON DELETE CASCADE. If referential integrity validation fails, use a query like the following to identify missing parent rows.
SELECT pk1, pk2 FROM child
EXCEPT DISTINCT
SELECT pk1, pk2 FROM parent; SET INTERLEAVE IN, likeSET INTERLEAVE IN PARENT, migrates anINTERLEAVE IN PARENTinterleaved table toINTERLEAVE IN, thus removing the parent-child enforcement between the two tables.- The
ON DELETEclause is only supported when migrating toINTERLEAVE IN PARENT.
ALTER COLUMN
- Changes the definition of an existing column on a table.
**_datatype_**[ NOT NULL ] [ DEFAULT (**_expression_**) [ ON UPDATE (**_expression_**)] | AS (**_expression_**) ]- This clause changes the data type of the column.
- The
DEFAULTclause has restrictions. See the description of this clause in[CREATE TABLE](#spanner-default-clause). - The
ON UPDATEclause has restrictions. See the description of this clause in[CREATE TABLE](#spanner-on-update). - Statements to set, change, or drop the default value or
ON UPDATEvalue of an existing column don't affect existing rows. - If the column has data and is altered to have the
NOT NULLconstraint, the statement might fail if there is at least one existing row with aNULLvalue. This is true even when aNOT NULL DEFAULT (...)is specified, because there is no backfill operation forALTER COLUMN. - If
DEFAULT,ON UPDATE, orNOT NULLare unspecified, these properties are removed from the column. - The
ASclause is used to Modify a generated column expression. ARRAY (vector_length=>**_vectorlengthvalue_**): You can use this clause to update the vector length of an array column for vector embeddings. The value of the vector length annotation indicates the dimension of the vectors in the column. The value must be an integer greater than or equal to zero. You can only use this parameter with an array that uses theFLOAT32orFLOAT64data types. That is,ARRAY<FLOAT32> (vector_length=>INT)orARRAY<FLOAT64> (vector_length=>INT). All values in the column must have the same array dimensions as defined byvector_length. It isn't supported for aDEFAULTor generated column.
SET OPTIONS( **_columnoptionsdef_** )- Use this clause to set an option at the column level of the schema hierarchy.
SET DEFAULT( **_expression_** )- Sets or changes a default value for the column. Only the metadata is affected. Existing data is not changed.
- This clause has restrictions. See the description of this clause in
[CREATE TABLE](#spanner-default-clause). - When you use this clause, the result of the expression must be assignable to the current column type. To change the column type and default value in a single statement, use the following:
ALTER TABLE**_table-name_**ALTER COLUMN**_column-name_** **_datatype_**DEFAULT**_expression_**
DROP DEFAULT- Drops the column default value. Only metadata is affected. Existing data is not changed. You can't use
DROP DEFAULTon a column that has anON UPDATEexpression.
- Drops the column default value. Only metadata is affected. Existing data is not changed. You can't use
SET ON UPDATE( **_expression_** )- Sets or changes the
ON UPDATEattribute for an existing column. Only metadata is affected. Existing data isn't changed. - This clause has restrictions. See the description of this clause in
[CREATE TABLE](#spanner-on-update). - The result of the expression must be compatible with the column's data type.
- This clause is specifically used for commit timestamp columns. To apply it, the column must meet one of the following conditions:
* It already has an identicalSET DEFAULTexpression and is already configured as a commit timestamp column.
* You are simultaneously updating the column definition (including the default value and commit timestamp option) within the sameALTER COLUMNstatement.
- Sets or changes the
DROP ON UPDATE- Drops the
ON UPDATEexpression on the column. Only metadata is affected. Existing data isn't changed.
- Drops the
ALTER IDENTITY- Sets or unsets the skipped range using
SET { SKIP RANGE**_skiprangemin_**,**_skiprangemax_**| NO SKIP RANGE }. - Restarts the internal counter with a specific value using
RESTART COUNTER WITH**_counterrestart_**. - These clauses are similar to Identity Columns in CREATE TABLE.
- Sets or unsets the skipped range using
ADD ROW DELETION POLICY ( OLDER_THAN ( **_timestampcolumn_** , INTERVAL **_numdays_** DAY ) )
- Adds a row deletion policy to the table defining the amount of time after a specific date after which to delete a row. See Time to live. Only one row deletion policy can exist on a table at a time.
DROP ROW DELETION POLICY
- Drops the row deletion policy on a table.
REPLACE ROW DELETION POLICY ( OLDER_THAN ( **_timestampcolumn_** , INTERVAL **_numdays_** DAY ) )
- Replaces the existing row deletion policy with a new policy.
SET OPTIONS ( **_tableoptionsdef_** )
- Use this clause to set an option at the table level of the schema hierarchy.
Parameters
IF EXISTS
- If the specified table doesn't exist, the
ALTER TABLEstatement has no effect. IF EXISTSisn't supported forSET OPTIONS
**_tablename_**
- The name of an existing table to alter.
**_columnname_**
- The name of a new or existing column. You can't change the key columns of a table.
**_datatype_**
- Data type of the new column, or new data type for an existing column.
- You can't change the data type of a generated column, or any columns referenced by the generated column.
- Changing the data type is not allowed on any columns referenced in a
[CHECK](#check%5Fconstraint)constraint.
**_columnoptionsdef_**
- The
(allow_commit_timestamp=true)option allows insert and update operations to request that Spanner write the commit timestamp of the transaction into the column. For more information, seeCommit timestamps in GoogleSQL-dialect databases.
**_tableconstraint_**
- New table constraint for the table.
**_constraintname_**
- The name of a new or existing constraint.
**_reftable_**
- The referenced table in a foreign key constraint.
**_refcolumn_**
- The referenced column in a foreign key constraint.
DROP TABLE
Removes a table.
Syntax
DROP TABLE [ IF EXISTS ] tablename
Description
Use the DROP TABLE statement to remove a table from the database.
DROP TABLEis not recoverable.- You can't drop a table if there are indexes over it, or if there are any tables or indexes interleaved within it.
- A
DROP TABLEstatement automatically drops the foreign keys and foreign keys backing indexes of a table.
Parameters
IF EXISTS
- If a table of the specified name doesn't exist, then the
DROPstatement has no effect and no error is generated.
**_tablename_**
- The name of the table to drop.
RENAME TABLE
Renames a table or multiple tables at once.
Syntax
RENAME TABLE oldtablename TO newtablename ... [, oldtablename2 TO newtablename2 ...]
Description
Renames a table or multiple tables simultaneously, for example, if the table name is misspelled. For more information, see Rename a table.
Parameters
**_oldtablename_**
- The old name of the table.
**_newtablename_**
- The new name for the table.
Example
This example shows how to change the names of multiple tables atomically.
RENAME TABLE Singers TO Artists, Albums TO Recordings;
INDEX statements
This section has information about the CREATE INDEX, ALTER INDEX, and DROP INDEX statements.
CREATE INDEX
Use the CREATE INDEX statement to definesecondary indexes.
Syntax
CREATE [ UNIQUE ] [ NULL_FILTERED ] INDEX [ IF NOT EXISTS ] indexname ON tablename ( keypart [, ...] ) [ storingclause ] [ whereclause ] [ , interleaveclause ] [ OPTIONS ( indexoptions [, ...] ) ]
where indexname is: {a—z|A—Z}[{a—z|A—Z|0—9|_}+]
and keypart is: columnname [ { ASC | DESC } ]
and storingclause is: STORING ( columnname [, ...] )
and whereclause is: WHERE columnname IS NOT NULL [AND ...]
and interleaveclause is: INTERLEAVE IN tablename
and indexoptions is: { locality_group = 'localitygroupname' | columnar_policy = 'columnarpolicy' }
Description
Spanner automatically indexes the primary key columns of each table.
You can use CREATE INDEX to create secondary indexes for other columns. Adding a secondary index on a column makes it more efficient to look up data in that column. For more details, see secondary indexes.
Parameters
UNIQUE
- Indicates that this secondary index enforces a
UNIQUEconstraint on the data being indexed. TheUNIQUEconstraint causes any transaction that would result in a duplicate index key to be rejected. SeeUnique Indexes for more information.
NULL_FILTERED
- Indicates that this secondary index does not index
NULLvalues. For more information, seeIndexing of NULL values.
IF NOT EXISTS
- If an index already exists with the same name, then the
CREATEstatement has no effect and no error is generated.
**_indexname_**
- The name of the index to be created. For information about naming rules, seeNames.
**_tablename_**
- The name of the table to be indexed.
WHERE IS NOT NULL
- Rows that contain NULL in any of the columns listed in this clause aren't included in the index. The columns must be stored in the index, including key columns and columns present in the
STORINGclause.
INTERLEAVE IN
- Defines a table to interleave the index in. If
Tis the table into which the index is interleaved, then the primary key ofTmust be the key prefix of the index, with each key matching in type, sort order, and nullability. Matching by name is not required.
If the index key that you want to use for index operations matches the key of a table, you might want to interleave the index in that table if the row in the table should have a data locality relationship with the corresponding indexed rows.
For example, if you want to index all rows ofSongsfor a particular row ofSingers, your index keys would containSingerIdandSongNameand your index would be a good candidate for interleaving inSingersif you frequently fetch information about a singer as you fetch that singer's songs from the index. The definition ofSongsBySingerSongNameinCreating a Secondary Indexis an example of creating such an interleaved index.
Like interleaved tables, entries in interleaved indexes are stored with the corresponding row of the parent table. Seedatabase splits for more details.
DESC
- Defines descending scan order for the corresponding index column. When scanning a table using an index column marked
DESC, the scanned rows appear in the descending order with respect to this index column. If you don't specify a sort order, the default is ascending (ASC).
STORING
- Provides a mechanism for duplicating data from the table into one or more secondary indexes on that table. At the cost of extra storage, this can reduce read latency when looking up data using a secondary index, because it eliminates the need to retrieve data from the main table after having found the selected entries in the index. See STORING clause for an example.
index_options
- Use
locality_group =**_localitygroupname_**to set a secondary index-level locality group override. For more information, see Locality groupsand Tiered storage overview. - Use
columnar_policy =**_columnarpolicy_**to write index data in columnar format. For more information, seeConfigure Spanner columnar engine.
ALTER INDEX
Use the ALTER INDEX statement to add additional columns or remove stored columns from the secondary indexes or to modify index options.
Syntax
ALTER INDEX indexname {ADD|DROP} STORED COLUMN columnname [ OPTIONS ( indexoptions [, ...] ) ]
where indexoptions is: { locality_group = 'localitygroupname' | columnar_policy = { 'columnarpolicy' | null } }
Description
Add an additional column into an index, remove a column from an index or modify index options.
Parameters
**_indexname_**
- The name of the index to alter.
**_columnname_**
- The name of the column to add into the index or to remove from the index.
**_indexoptions_**
- Use
locality_group =**_localitygroupname_**to alter the locality group. For more information, see Locality groupsand Tiered storage overview. - Use
columnar_policy =**_columnarpolicy_**to write index data in columnar format. For more information, seeConfigure Spanner columnar engine.
DROP INDEX
Removes a secondary index.
Syntax
DROP INDEX [ IF EXISTS ] indexname
Description
Use the DROP INDEX statement to drop a secondary index.
Parameters
IF EXISTS
- If an index of the specified name doesn't exist, then the
DROPstatement has no effect and no error is generated.
**_indexname_**
- The name of the index to drop.
SEARCH INDEX statements
This section has information about the CREATE SEARCH INDEX, ALTER SEARCH INDEX, and DROP SEARCH INDEX statements.
CREATE SEARCH INDEX
Use the CREATE SEARCH INDEX statement to define search indexes. For more information, see Search indexes.
Syntax
CREATE SEARCH INDEX indexname ON tablename ( tokencolumnlist ) [ storingclause ] [ partitionclause ] [ orderbyclause ] [ whereclause ] [ interleaveclause ] [ optionsclause ]
where indexname is: {a—z|A—Z}[{a—z|A—Z|0—9|_}+]
and tokencolumnlist is: columnname [, ...]
and storingclause is: STORING ( columnname [, ...] )
and partitionclause is: PARTITION BY columnname [, ...]
and orderbyclause is: ORDER BY columnname [ {ASC | DESC} ]
and whereclause is: WHERE columnname IS NOT NULL [AND ...]
and interleaveclause is: , INTERLEAVE IN tablename
and optionsclause is: OPTIONS ( optionname=optionvalue [, ...] )
Description
You can use CREATE SEARCH INDEX to create search indexes for TOKENLISTcolumns. Adding a search index on a column makes it more efficient to search data in the source column of the TOKENLIST.
Parameters
**_indexname_**
- The name of the search index to be created. For naming rules, seeNames.
**_tablename_**
- The name of the table to be indexed for search.
token_column_list
- A list of
TOKENLISTcolumns to be indexed for search.
STORING
- Provides a mechanism for duplicating data from the table into the search index. This is the same as
STORINGin secondary indexes. For more information, see STORING clause.
PARTITION BY
- A list of columns to partition the search index by. Partition columns subdivide the index into smaller units, one for each unique partition. Queries can only search within a single partition at a time. Queries against partitioned indexes are generally more efficient than queries against unpartitioned indexes because only splits from a single partition need to be read.
ORDER BY
- A list of
INT64columns that the search index will store rows in that order within a partition. The column must beNOT NULL, or the index must defineWHERE IS NOT NULL. This property can support at most one column.
WHERE IS NOT NULL
- Rows that contain NULL in any of the columns listed in this clause aren't included in the index. The columns must be stored in the index, including key columns and columns present in the
STORINGclause.
INTERLEAVE IN
- Similarly to secondary indexes INTERLEAVE IN, search indexes can be interleaved in an ancestor table of the base table. The primary reason to use interleaved search indexes is to colocate base table data with index data for small partitions.
- Interleaved search indexes have three restrictions:
- Only sort-order sharded indexes can be interleaved.
- Search indexes can only be interleaved in top-level tables (and not in child tables).
- Like interleaved tables and secondary indexes, the key of the parent table must be a prefix of the interleaved search index's
PARTITION BYcolumns.
OPTIONS
- A list of key value pairs that overrides the default settings of the search index.
sort_order_shardingWhentrue, the search index will be sharded by one or more columns specified in theORDER BYclause. Whenfalse, the search index is sharded uniformly. Default value isfalse. Seesearch index shardingfor more details.
ALTER SEARCH INDEX
Use the ALTER SEARCH INDEX statement to add or remove columns from the search indexes.
Syntax
ALTER SEARCH INDEX indexname {ADD|DROP} [STORED] COLUMN columnname
Description
Add a TOKENLIST column into a search index or remove an existing TOKENLISTcolumn from a search index. Use STORED COLUMN to add or remove stored columns from a search index.
Parameters
**_indexname_**
- The name of the search index to alter.
**_columnname_**
- The name of the column to add into the index or to remove from the search index.
DROP SEARCH INDEX
Removes a search index.
Syntax
DROP SEARCH INDEX [ IF EXISTS ] indexname
Description
Use the DROP SEARCH INDEX statement to drop a search index.
Parameters
IF EXISTS
- If a search index with the specified name doesn't exist, then the
DROPstatement has no effect and no error is generated.
**_indexname_**
- The name of the search index to drop.
VIEW statements
This section has information about the CREATE VIEW, CREATE OR REPLACE VIEW, and DROP VIEW statements.
CREATE VIEW and CREATE OR REPLACE VIEW
Use the CREATE VIEW or CREATE OR REPLACE VIEW statement to define aview.
Syntax
{ CREATE VIEW | CREATE OR REPLACE VIEW } viewname SQL SECURITY { INVOKER | DEFINER } AS query
Description
CREATE VIEW defines a new view in the current database. If a view named_viewname_ exists, the CREATE VIEW statement fails.
CREATE OR REPLACE VIEW defines a new view in the current database. If a view named _viewname_ exists, its definition is replaced. Use this statement to replace the security type of a view.
Parameters
**_viewname_**
- The name of the view to be created. For naming rules, see Names.
SQL SECURITY
- The security type can be either
INVOKERorDEFINER. Depending on the security type of the view, Spanner may or may not access check the objects referenced in the view against the database role of the principal who invoked the query. For more information, see About views.
AS **_query_**
- The query that defines the view content.
- The query must specify a name for each item in theSELECT list.
- The query cannot include query parameters.
- GoogleSQL disregards anyORDER BY clause in this query that isn't paired with aLIMIT clause.
See Query syntax for information on constructing a query.
DROP VIEW
Removes a view.
Syntax
DROP VIEW [ IF EXISTS ] viewname
Description
Use the DROP VIEW statement to remove a view from the database. Unless the IF EXISTS clause is specified, the statement fails if the view doesn't exist.
Parameters
**_IF EXISTS_**
- If the view doesn't exist, the
DROPstatement has no effect and doesn't generate an error.
**_viewname_**
- The name of the view to drop.
CHANGE STREAM statements
This section has information about the CREATE CHANGE STREAM, ALTER CHANGE STREAM, and DROP CHANGE STREAM statements.
CREATE CHANGE STREAM
Defines a new change stream.
Syntax
CREATE CHANGE STREAM [ IF NOT EXISTS ] changestreamname [ FOR { tablecolumns [, ... ] | ALL } ] [ OPTIONS ( changestreamoption [, ... ] ) ]
where tablecolumns is: tablename [ ( [ columnname, ... ] ) ]
and changestreamoption is: { retention_period = 'duration' | value_capture_type = { 'OLDANDNEWVALUES' | 'NEWROW' |'NEWVALUES' | 'NEWROWANDOLDVALUES' } | exclude_ttl_deletes = { false | true } | exclude_insert = { false | true } | exclude_update = { false | true } | exclude_delete = { false | true } | allow_txn_exclusion = { false | true } }
Description
CREATE CHANGE STREAM defines a new change stream in the current database. For more information, seeCreate a change stream.
Parameters
IF NOT EXISTS
- If a change stream exists with the same name, the
CREATEstatement has no effect and doesn't generate an error.
**_changestreamname_**
- The name of the change stream to be created. The maximum number of characters of a change stream name is 128. However, the name you provide is prepended with the 10 character prefix,
READ_JSON_. Because of this, the maximum number of characters you can assign to**_changestreamname_**` is 118. For further naming rules, seeNames.
FOR { **_tablecolumns_** [, ... ] | ALL }
- The
FORclause defines the tables and columns that are watched by the change stream. - You can specify a list of
**_tablecolumns_**to watch, where**_tablecolumns_**can be either of the following:**_tablename_**: This watches the entire table, including all of the future columns when they are added to this table.**_tablename_**( [**_columnname_**, ... ] ): You can optionally specify a list of zero or more non-key columns following the table name. This watches only the primary key and the listed non-key columns of the table. With an empty list of non-key columns,**_tablename_**()watches only the primary key.
ALLlets you watch all tables and columns in the entire database, including all of the future tables and columns as soon as they are created.- When the
FORclause is omitted, the change stream watches nothing.
OPTIONS ( **_changestreamoption_** [, ... ] )
- The
retention_period = 'duration'option lets you specify how long a change stream retains its data. The duration must be in the range[1d, 7d]and can be specified in days, hours, minutes, or seconds. For example, the values1d,24h,1440m, and86400sare equivalent. The default is 1 day. For more information, see Data retention. - The
value_capture_typeoption controls which values are captured for a changed row. It can beOLD_AND_NEW_VALUES(default),NEW_VALUES,NEW_ROW, orNEW_ROW_AND_OLD_VALUES. For more information, see Value capture type. - The
exclude_ttl_deletesconfiguration parameter lets you filter outtime to live based deletes from your change stream. When you set this filter, only future TTL-based deletes are removed. It can be set tofalse(default) ortrue. For more information, see TTL-based deletes filter. - The
exclude_insertconfiguration parameter lets you filter out allINSERTtable modifications from your change stream. It can be set tofalse(default) ortrue. For more information, seeTable modification type filters. - The
exclude_updateconfiguration parameter lets you filter out allUPDATEtable modifications from your change stream. It can be set tofalse(default) ortrue. For more information, seeTable modification type filters. - The
exclude_deleteconfiguration parameter lets you filter out allDELETEtable modifications from your change stream. It can be set tofalse(default) ortrue. For more information, seeTable modification type filters. - The
allow_txn_exclusionconfiguration parameter lets you enable transaction-level records exclusion. It can be set tofalse(default) ortrue. For more information, seeTransaction-level records exclusion.
ALTER CHANGE STREAM
Changes the definition of a change stream.
Syntax
ALTER CHANGE STREAM changestreamname action
where action is: { SET FOR { tablecolumns [, ... ] | ALL } | DROP FOR ALL | SET OPTIONS ( changestreamoption [, ... ] ) }
and tablecolumns is: tablename [ ( [ columnname, ... ] ) ]
and changestreamoption is: { retention_period = { 'duration' | null } | value_capture_type = { 'OLDANDNEWVALUES' | 'NEWROW' | 'NEWVALUES' | 'NEWROWANDOLDVALUES' | null } | exclude_ttl_deletes = { false | true | null } | exclude_insert = { false | true | null } | exclude_update = { false | true | null } | exclude_delete = { false | true | null } | allow_txn_exclusion = { false | true | null } }
Description
ALTER CHANGE STREAM changes the definition of an existing change stream. For more information, seeModify a change stream.
Parameters
**_changestreamname_**
- The name of an existing change stream to alter.
SET FOR { **_tablecolumns_** [, ... ] | ALL }
- Sets a new
FORclause to modify what the change stream watches, using the same syntax as[CREATE CHANGE STREAM](#for-clause).
DROP FOR ALL
- Suspends a change stream to watch nothing.
SET OPTIONS
- Sets options on the change stream (such as
retention_period,value_capture_type,exclude_ttl_deletes,exclude_insert,exclude_update,exclude_delete, andallow_txn_exclusion), using the same syntax as[CREATE CHANGE STREAM](#change-stream-options). - Setting an option to
nullis equivalent to setting it to the default value.
DROP CHANGE STREAM
Removes a change stream.
Syntax
DROP CHANGE STREAM [ IF EXISTS ] changestreamname
Description
Use the DROP CHANGE STREAM statement to remove a change stream from the database and delete its data change records.
Parameters
IF EXISTS
- If a change stream of the specified name doesn't exist, the
DROPstatement has no effect and doesn't generate an error.
**_changestreamname_**
- The name of the change stream to drop.
ROLE statements
This section has information about the CREATE ROLE and DROP ROLE statements.
CREATE ROLE
Defines a new database role.
Syntax
CREATE ROLE databaserolename
Description
CREATE ROLE defines a new database role. Database roles are collections offine-grained access control privileges. You can create only one role with this statement.
Parameters
**_databaserolename_**
- The name of the database role to create. The role name
publicand role names starting withspanner_are reserved for system roles. See also Names.
Example
This example creates the database role hr_manager.
CREATE ROLE hr_manager
DROP ROLE
Drops a database role.
Syntax
DROP ROLE databaserolename
Description
DROP ROLE drops a database role. You can drop only one role with this statement.
You can't drop a database role if it has any privileges granted to it. All privileges granted to a database role must be revoked before the role can be dropped. You can drop a database role whether or not access to it is granted to IAM principals.
Dropping a role automatically revokes its membership in other roles and revokes the membership of its members.
You can't drop system roles.
Parameters
**_databaserolename_**
- The name of the database role to drop.
Example
This example drops the database role hr_manager.
DROP ROLE hr_manager
GRANT and REVOKE statements
This section has information about the GRANT and REVOKE statements.
GRANT
Grants privileges that allow database roles to access database objects.
Syntax
GRANT { SELECT | INSERT | UPDATE | DELETE } ON TABLE tablelist | ON ALL TABLES IN SCHEMA schema_name [, ...] TO ROLE rolelist
GRANT { SELECT | INSERT | UPDATE } (columnlist) ON TABLE tablelist TO ROLE rolelist
GRANT SELECT ON CHANGE STREAM changestreamlist | ON ALL CHANGE STREAMS IN SCHEMA schema_name [, ...] TO ROLE rolelist
GRANT { SELECT | UPDATE } ON SEQUENCE sequencelist | ON ALL SEQUENCES IN SCHEMA schema_name [, ...] TO ROLE rolelist
GRANT SELECT ON VIEW viewlist | ON ALL VIEWS IN SCHEMA schema_name [, ...] TO ROLE rolelist
GRANT EXECUTE ON TABLE FUNCTION functionlist TO ROLE rolelist
GRANT ROLE rolelist TO ROLE rolelist
GRANT USAGE ON SCHEMA [DEFAULT | schemanamelist] TO ROLE rolelist
where tablelist is: tablename [, ...]
and columnlist is: columnname [,...]
and viewlist is: viewname [, ...]
and changestreamlist is: changestreamname [, ...]
and sequencelist is: sequencename [, ...]
and functionlist is: changestreamreadfunctionname [, ...]
and schemanamelist is: schemaname [, ...]
and rolelist is: databaserolename [, ...]
Description
For fine-grained access control, grants privileges on one or more tables, views, change streams, SEQUENCE objects, or change stream read functions to database roles. Also grants database roles to other database roles to create a database role hierarchy with inheritance. When granting SELECT, INSERT, or UPDATE on a table, optionally grants privileges on only a subset of table columns.
Parameters
**_tablename_**
- The name of an existing table.
**_columnname_**
- The name of an existing column in the specified table.
**_viewname_**
- The name of an existing view.
**_changestreamname_**
- The name of an existing change stream.
**_changestreamreadfunctionname_**
- The name of an existing read function for a change stream. For more information, see Change stream read functions and query syntax.
**_schemaname_**
- The name of the schema.
**_sequencename_**
- The name of an existing sequence.
**_databaserolename_**
- The name of an existing database role.
Notes and restrictions
- Identifiers for database objects named in the
GRANTstatement must use the case that was specified when the object was created. For example, if you created a table with a name that is in all lower case with a capitalized first letter, you must use that same case in theGRANTstatement. Table-valued functions (TVFs) get automatically created with a prefix added to the change stream name, so ensure that you use the proper case for both the prefix and the change stream name. For more information about TVFs, seeChange stream query syntax. created a table with a name that is in all lower case with a capitalized first letter, you must use that same case in theGRANTstatement. For each change stream, GoogleSQL automatically creates a change stream read function with a name that consists of a prefix added to the change stream name, so ensure that you use the proper case for both the prefix and the change stream name. For more information about change stream read functions, see Change stream query syntax. - When granting column-level privileges on multiple tables, each table must contain the named columns.
- If a table contains a column that is marked
NOT NULLand has no default value, you can't insert into the table unless you have theINSERTprivilege on that column. - After granting
SELECTon a change stream to a role, grantEXECUTEto that role on the read function for the change stream. For information about change stream read functions, see Change stream read functions and query syntax. - Granting
SELECTon a table doesn't grantSELECTon the change stream that tracks it. You must make a separate grant for the change stream. ALL TABLES IN SCHEMA,ALL CHANGE STREAMS IN SCHEMA, andALL VIEWS IN SCHEMAperforms a one-time bulk grant for a role to all those database objects that use the schema, but not to future objects that use the schema.
Examples
The following example grants SELECT on the employees table to the hr_reprole. Grantees of the hr_rep role can read all columns of employees.
GRANT SELECT ON TABLE employees TO ROLE hr_rep;
The next example grants SELECT on a subset of columns of the contractorstable to the hr_rep role. Grantees of the hr_rep role can read-only the named columns.
GRANT SELECT(name, address, phone) ON TABLE contractors TO ROLE hr_rep;
The next example mixes table-level and column-level grants. hr_managercan read all table columns, but can update only the location column.
GRANT SELECT, UPDATE(location) ON TABLE employees TO ROLE hr_manager;
The next example makes column-level grants on two tables. Both tables must contain the name, level, and location columns.
GRANT SELECT(name, level, location), UPDATE(location) ON TABLE employees, contractors TO ROLE hr_manager;
The next example grants INSERT on a subset of columns of the employeestable.
GRANT INSERT(name, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager;
The next example grants the database role pii_access to the roles hr_managerand hr_director. The hr_manager and hr_director roles are members ofpii_access and inherit the privileges that were granted to pii_access. For more information, see Database role hierarchies and inheritance.
GRANT ROLE pii_access TO ROLE hr_manager, hr_director;
The following example grants SELECT and UPDATE on the sequence_objectsequence to the app_developer role.
GRANT SELECT, UPDATE ON SEQUENCE sequence_object TO ROLE app_developer;
The next example grants SELECT on all sequences in the default schema to the data_analyst role.
GRANT SELECT ON ALL SEQUENCES IN SCHEMA default TO ROLE data_analyst;
REVOKE
Revokes privileges that allow database roles access to database objects.
Syntax
REVOKE { SELECT | INSERT | UPDATE | DELETE } ON TABLE tablelist | ON ALL TABLES IN SCHEMA schema_name [, ...] FROM ROLE rolelist
REVOKE { SELECT | INSERT | UPDATE }(columnlist) ON TABLE tablelist FROM ROLE rolelist
REVOKE SELECT ON VIEW viewlist FROM ROLE rolelist
REVOKE SELECT ON CHANGE STREAM changestreamlist FROM ROLE rolelist
REVOKE { SELECT | UPDATE } ON SEQUENCE sequencelist | ON ALL SEQUENCES IN SCHEMA schema_name [, ...] FROM ROLE rolelist
REVOKE EXECUTE ON TABLE FUNCTION functionlist FROM ROLE rolelist
REVOKE ROLE rolelist FROM ROLE rolelist
and tablelist is: tablename [, ...]
and columnlist is: columnname [,...]
and viewlist is: viewname [, ...]
and changestreamlist is: changestreamname [, ...]
and sequencelist is: sequencename [, ...]
and functionlist is: changestreamreadfunctionname [, ...]
and rolelist is: databaserolename [, ...]
Description
For fine-grained access control, revokes privileges on one or more tables, views, change streams, SEQUENCE objects, or change stream read functions from database roles. Also revokes database roles from other database roles. When revoking SELECT, INSERT, or UPDATE on a table, optionally revokes privileges on only a subset of table columns.
Parameters
**_tablename_**
- The name of an existing table.
**_columnname_**
- The name of an existing column in the previously specified table.
**_viewname_**
- The name of an existing view.
**_changestreamname_**
- The name of an existing change stream.
**_changestreamreadfunctionname_**
- The name of an existing read function for a change stream. For more information, see Change stream read functions and query syntax.
**_databaserolename_**
- The name of an existing database role.
**_sequencename_**
- The name of an existing sequence.
Notes and restrictions
- Identifiers for database objects named in the
REVOKEstatement must use the case that was specified when the object was created. For example, if you created a table with a name that is in all lower case with a capitalized first letter, you must use that same case in theREVOKEstatement. For each change stream, GoogleSQL automatically creates a change stream read function with a name that consists of a prefix added to the change stream name, so ensure that you use the proper case for both the prefix and the change stream name. For more information about change stream read functions, see Change stream query syntax. - When revoking column-level privileges on multiple tables, each table must contain the named columns.
- A
REVOKEstatement at the column level has no effect if privileges were granted at the table level. - After revoking
SELECTon a change stream from a role, revokeEXECUTEon the change stream's read function from that role. - Revoking
SELECTon a change stream doesn't revoke any privileges on the table that it tracks.
Examples
The following example revokes SELECT on the employees table from the rolehr_rep.
REVOKE SELECT ON TABLE employees FROM ROLE hr_rep;
The next example revokes SELECT on a subset of columns of the contractorstable from the role hr_rep.
REVOKE SELECT(name, address, phone) ON TABLE contractors FROM ROLE hr_rep;
The next example shows revoking both table-level and column-level privileges in a single statement.
REVOKE SELECT, UPDATE(location) ON TABLE employees FROM ROLE hr_manager;
The next example revokes column-level grants on two tables. Both tables must contain the name, level, and location columns.
REVOKE SELECT(name, level, location), UPDATE(location) ON TABLE employees, contractors FROM ROLE hr_manager;
The next example revokes INSERT on a subset of columns.
REVOKE INSERT(name, cost_center, location, manager) ON TABLE employees FROM ROLE hr_manager;
The following example revokes the database role pii_access from thehr_manager and hr_director database roles. The hr_manager andhr_director roles lose any privileges that they inherited from pii_access.
REVOKE ROLE pii_access FROM ROLE hr_manager, hr_director;
The following example revokes UPDATE on the sequence_object sequence from theapp_developer role.
REVOKE UPDATE ON SEQUENCE sequence_object FROM ROLE app_developer;
SEQUENCE statements
This section has information about the CREATE SEQUENCE,ALTER SEQUENCE, andDROP SEQUENCE` statements.
CREATE SEQUENCE
Creates a sequence object.
Syntax
CREATE SEQUENCE [ IF NOT EXISTS ] sequencename [ sequenceoptionclause ... ] [ OPTIONS ( sequenceoptions ) ]
where sequenceoptionclause is: BIT_REVERSED_POSITIVE | SKIP RANGE skiprangemin, skiprangemax | START COUNTER WITH startwithcounter
Description
When you use a CREATE SEQUENCE statement, Spanner creates a schema object that you can poll for values using the GET_NEXT_SEQUENCE_VALUEfunction.
Parameters
**IF NOT EXISTS**
- If a sequence already exists with the same name, then the CREATE statement has no effect and no error is generated.
**_sequencename_**
- The name of the sequence to create. For naming rules, see Names.
**OPTIONS (_sequenceoptions_**)
- Use this clause to set an option on the specified sequence. Each sequence option uses a
key=valuepair, where key is the option name, and value is a literal. Multiple options are separated by commas. Options use the following syntax:
OPTIONS (option_name = value [,...]) A sequence accepts the following options:
- The
**_sequencekind_**option accepts aSTRINGto indicate the type of sequence to use. At this time,bit_reversed_positiveis the only valid type and it's a required option. - The
**_skiprangemin_**and**_skiprangemax_**parameters cause the sequence to skip the numbers in this range when callingGET_NEXT_SEQUENCE_VALUE. The skipped range is inclusive. These parameters are both integers that have a default value of NULL. The accepted values forskip_range_minis any value that is less than or equal toskip_range_max. The accepted values forskip_range_maxis any value that is more than or equal toskip_range_min. - The
**_startwithcounter_**option is a positiveINT64value that Spanner uses to set the next value for the internal sequence counter. For example, the next time that Spanner obtains a value from the bit-reversed sequence, it begins withstart_with_counter. Spanner bit reverses this value before returning it to the client. The default value is1.
Examples
# Create a positive bit-reversed sequence to use in a primary key.
CREATE SEQUENCE MySequence OPTIONS (
sequence_kind='bit_reversed_positive',
skip_range_min = 1,
skip_range_max = 1000,
start_with_counter = 50);
# Create a table that uses the sequence for a key column.
CREATE TABLE Singers (
SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE MySequence)),
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo googlesql.example.SingerInfo,
BirthDate DATE
) PRIMARY KEY (SingerId);
Use the following SQL to query information about sequences.
SELECT * FROM information_schema.sequences;
SELECT * FROM information_schema.sequence_options;
ALTER SEQUENCE
Makes changes to the sequence object.
Syntax
ALTER SEQUENCE sequencename { SET OPTIONS sequenceoptions | sequenceoptionclause ... }
where sequenceoptionclause is: { { SKIP RANGE skiprangemin, skiprangemax | NO SKIP RANGE } | RESTART COUNTER WITH counterrestart }
Description
ALTER SEQUENCE makes changes to the specified sequence schema object. Executing this statement doesn't affect values the sequence already generated. If the ALTER SEQUENCE statement doesn't include an option, the current value of the option remains the same.
Parameters
**_sequencename_**
- The name of an existing sequence to alter.
**_sequencename_**is case sensitive. Don't include the path in the**_sequencename_**.
**SET OPTIONS (_sequenceoptions_**)
- Use this clause to set an option on the specified sequence. Each sequence option uses a
key=valuepair, where key is the option name, and value is a literal. Multiple options are separated by commas. Options use the following syntax:
SET OPTIONS (option_name = value [,...]) This parameter offers the same options as CREATE SEQUENCE.
Examples
# Alter the sequence to include a skipped range. This is useful when you are
# migrating from a regular sequence with sequential data
ALTER SEQUENCE MySequence
SET OPTIONS (skip_range_min=1, skip_range_max=1234567);
DROP SEQUENCE
Drops a specific sequence.
Syntax
DROP SEQUENCE [IF EXISTS] sequencename
Description
DROP SEQUENCE drops a specific sequence. Spanner can't drop a sequence if its name appears in a sequence function that is used in a column default value or a view.
Parameters
**_sequencename_**
- The name of the existing sequence to drop.
IF EXISTS - If a sequence of the specified name doesn't exist, then the
DROPstatement has no effect and no error is generated.
STATISTICS statements
This section has information about the ALTER STATISTICS and ANALYZEstatements.
ALTER STATISTICS
Changes the definition of a query optimizer statistics package.
Syntax
ALTER STATISTICS packagename action
where packagename is: {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}
and action is: SET OPTIONS ( options_def )
and optionsdef is: { allow_gc = { true | false } }
Description
ALTER STATISTICS changes the definition of a query optimizer statistics package.
SET OPTIONS
- Use this clause to set an option on the specified statistics package.
Parameters
**_packagename_**
- The name of an existing query optimizer statistics package whose attributes are to be altered.
To fetch existing statistics packages, run the following query:
SELECT s.package_name AS package_name, s.allow_gc AS allow_gc FROM INFORMATION_SCHEMA.SPANNER_STATISTICS s; **_optionsdef_**
- The
allow_gc = { true | false }option lets you specify whether a given statistics package is garbage collected. A package must be set asallow_gc=falseif it is used in a query hint. For more information, see Garbage collection of statistics packages.
ANALYZE
Start a new query optimizer statistics package construction.
Syntax
ANALYZE
Description
ANALYZE starts a new query optimizer statistics package construction.
MODEL statements
This section has information about the CREATE MODEL, ALTER MODEL, andDROP MODEL statements.
CREATE MODEL and CREATE OR REPLACE MODEL
Use the CREATE MODEL or CREATE OR REPLACE MODEL statement to define an ML model.
Syntax
{ CREATE MODEL | CREATE OR REPLACE MODEL | CREATE MODEL IF NOT EXISTS } modelname [INPUT ( columnlist ) OUTPUT ( columnlist )] REMOTE [OPTIONS ( modeloptions )]
where columnlist is: { columnname datatype [OPTIONS ( modelcolumnoptions )] [, ... ] }
and modelcolumnoptions is: { required = { true | false } }
and modeloptions is: { endpoint = '{endpointaddress}', endpoints = [ '{endpointaddress}' [, ...] ], default_batch_size = int64value }
Description
CREATE MODEL registers a reference to the Gemini Enterprise Agent Platform ML model in the current database. If a model named model_name already exists, the CREATE MODEL statement fails.
CREATE OR REPLACE MODEL registers a reference to the Agent Platform ML model in the current database. If a model named model_name already exists, its definition is replaced.
CREATE MODEL IF NOT EXISTS registers a reference to the Agent Platform ML model in the current database. If a model named model_name already exists, the CREATE MODEL IF NOT EXISTS statement does not have any effect and no error is generated.
As soon as the model reference is registered in a database, it can be used from queries that use the ML.Predict function.
Model registration doesn't result in copying a model from the Agent Platform to a database, but only in creation of a reference to this models' endpoint hosted in the Agent Platform. If the model's endpoint gets removed from the Agent Platform, Spanner queries referencing this model fail.
Model endpoint access control
To be able to access a registered Agent Platform model endpoint from Spanner, you need to grant access permission to Spanner's service agent account.
Spanner creates the service agent and grants the necessary permissions when Spanner executes the first MODEL DDL statement. If both the Spanner database and the Agent Platform endpoint are in the same project, then no additional setup is required.
If the Spanner service agent account doesn't exist for your Spanner project, create it by running the following command:
gcloud beta services identity create --service=spanner.googleapis.com --project={PROJECT}`
Follow the steps described in the following tutorial to grant the Spanner API Service Agent role to the Spanner service agent accountservice-{PROJECT}@gcp-sa-spanner.iam.gserviceaccount.comon your Agent Platform project.
Parameters
**_modelname_**
- The name of the model to be created. See Names.
**_INPUT ( columnlist ) OUTPUT ( columnlist )_**
- Lists of columns that define model inputs (that is, features) and outputs (that is, labels). The following types (used in the
typefield ofcolumn_list) are supported:BOOL,BYTES,FLOAT32,FLOAT64,INT64,STRING, andARRAYof listed types.- Map the model's input or output columns with 32-bit integer types to
INT64.
- Map the model's input or output columns with 32-bit integer types to
- If the Agent Platform endpoint hasinstance and prediction schemas, Spanner validates the provided
INPUTandOUTPUTclauses against those remote schemas. You can also omitINPUTandOUTPUTclauses, letting Spanner automatically discover the endpoint schema. - If the Agent Platform endpoint does not haveinstance and prediction schemas,
INPUTandOUTPUTclauses must be provided. Spanner doesn't perform validation and mismatches result in runtime errors. We strongly recommend providing instance and prediction schemas, especially when using custom models.
**_modelcolumnoptions_**
- required lets you mark input or output columns as optional to match your Agent Platform schema.
- Input columns cannot be declared optional if the instance field is required.
- Optional input columns can be omitted in ML function calls.
- Required input columns must be provided to ML function calls.
- Output columns cannot be declared as required if the prediction field is optional.
- Optional outputs columns can return NULL if the endpoint does not produce them.
- Required outputs columns must be produced by the endpoint.
**_modeloptions_**
- endpoint is the address of the Agent Platform endpoint to connect to. Mutually exclusive with endpoints option. Supported formats:
//aiplatform.googleapis.com/projects/{project}/locations/{location}/endpoints/{endpoint}.//aiplatform.googleapis.com/projects/{project}/locations/{location}/publishers/{publisher}/models/{endpoint}.https://{location}-aiplatform.googleapis.com/v1/projects/{project}/locations/{location}/endpoints/{endpoint}.https://{location}-aiplatform.googleapis.com/v1/projects/{project}/locations/{location}/publishers/{publisher}/models/{endpoint}.
- endpoints is a list of addresses of Agent Platform endpoints to connect to. Mutually exclusive with endpoint option. Prediction starts with the first endpoint on the list and fails over in the specified order. Endpoints can host different models as long as their schemas can be merged together:
- Each column's name must use the same case across all endpoints
- Each column's type must be the same across all endpoints.
- Each input column is considered required if at least one endpoint requires it
- Each output column is considered required only if all endpoints require it
- default_batch_size specifies the maximum number of rows per remote inference call. The value must be between 1 and 10. For models that don't support batching, you must set the value to 1. This default value can be overridden with per-query hints.
ALTER MODEL
Changes the definition of a model.
Syntax
ALTER MODEL [ IF EXISTS ] modelname SET OPTIONS ( model_options )
where modeloptions is: { endpoint = '{endpointaddress}', endpoints = [ '{endpointaddress}' [, ...] ], default_batch_size = int64value }
Description
ALTER MODEL changes the definition of an existing table.
Parameters
**_modelname_**
- The name of an existing model whose attributes are to be altered.
SET OPTIONS
- Sets options on the model, using the same syntax as
[CREATE MODEL](#create%5Fmodel). - Setting an option to
nullis equivalent to setting it to the default value. - The following list of options which can be updated:
- endpoint is the address of the Agent Platform endpoint to connect to.
- endpoints is a list of addresses of Agent Platform endpoints to connect to. Mutually exclusive with endpoint option.
- default_batch_size specifies the maximum number of rows per remote inference call. The value must be between 1 and 10. For models that don't support batching, you must set the value to 1. This default value can be overridden with per-query hints.
DROP MODEL
Removes a model.
Syntax
DROP MODEL [ IF EXISTS ] modelname
Description
Use the DROP MODEL statement to remove a model definition from the database. Unless the IF EXISTS clause is specified, the statement fails if the model doesn't exist.
After you delete a model definition, all SQL queries referencing the deleted model fail. Dropping a model definition does not affect the underlying the Agent Platform endpoint that this model is attached to.
Parameters
**_modelname_**
- The name of the model to drop.
VECTOR INDEX statements
If you have a table with a large amount of vector data, you can use a vector index to perform similarity searches and approximate nearest neighbor (ANN)queries efficiently, with the trade-off of reduced recalland more approximate results.
CREATE VECTOR INDEX
Creates a new vector index on a column of a table.
Syntax
CREATE VECTOR INDEX [ IF NOT EXISTS ] indexname ON tablename (columnname [, extrakeycolumnname, ...] ) [ STORING ( columnname [, ...] ) ] [ WHERE columnname IS NOT NULL ] OPTIONS(index_option_list)
Parameters
IF NOT EXISTS
- If there is already a vector index with that name in the table, do nothing.
**_indexname_**
- The name of the vector index you're creating. This name must be unique for each database.
**_tablename_**
- The name of the table.
**_columnname_**
- The name of an embedding column with a type of
ARRAY<FLOAT64>(vector_length=>INT)orARRAY<FLOAT32>(vector_length=>INT). The column can't have any child fields. All elements in the array must be non-NULL, and all values in the column must have the same array dimensions as defined byvector_length. If the embedding column isn't defined asNOT NULL, then use theWHERE column_name IS NOT NULLclause when creating the vector index. If you include additionalextra_key_column_namein the vector index, the embedding column must be the first column listed.
**_extrakeycolumnname_**
- The name of one or more non-embedding columns that you use as keys in the index. These columns must appear after
column_name. Extra keys are arranged as actual keys within the underlying Spanner data structure supporting the index. These extra keys help the query engine speed up ANN queries, similar to how keys are used insecondary indexes. Compared to usingSTORINGcolumns, key columns have the following characteristics:- They must be valid key types.
- They incur slightly more processing cost than using storing columns.
- You can't add or drop key columns.
WHERE IS NOT NULL
- Rows that contain NULL in any of the columns listed in this clause aren't included in the index. The columns must be present in the indexed columns or
STORINGclause.
STORING
- Provides a mechanism for duplicating data from the table into the vector index. This is the same as
STORINGin a secondary index. For more information, see STORING clause.
- The list of options to set on the vector index.
Description
You can only create a new vector index on a column of a table.
index_option_list
The index option list specifies options for the vector index. Spanner creates tree-based vector indexes which use a tree-like structure to partition vector data. Using index_option_list, you can define the specific distance metric and search tree specification used to create the vector index. Specify the options in the following format: NAME=VALUE, ....
The following index options are supported:
| NAME | VALUE | Details |
|---|---|---|
| distance_type | STRING | Required. The distance metric used to build the vector index. This value can be COSINE,DOT_PRODUCT, or EUCLIDEAN. |
| tree_depth | INT | The tree depth (level). This value can be either 2 or 3. A tree with 2 levels only has leaves (num_leaves) as nodes. If the dataset has more than 100 million rows, then you can use a tree with 3 levels and add branches (num_branches) to further partition the dataset. |
| num_leaves | INT | The number of leaves (i.e. potential partitions) for the vector data. You can designate num_leaves for trees with 2 or 3 levels. We recommend that the number of leaves is number_of_rows_in_dataset/1000. |
| num_branches | INT | The number of branches to further parititon the vector data. You can only designate num_branches for trees with 3 levels. The number of branches must be fewer than the number of leaves. We recommend that the number of leaves is between 1000 andsqrt(number_of_rows_in_dataset). |
| disable_search | BOOL | The disable_search = true option prevents Spanner from using a vector index in your database. If you use the FORCE_INDEX hint to specify a vector index which has the disable_search option set to true, the query fails. |
Examples
The following example creates a vector index Singer_vector_index on theembedding column of the Singers table and defines the distance type:
CREATE TABLE Singers(id INT64, genre STRING, embedding ARRAY<FLOAT32>(vector_length=>128))
PRIMARY KEY(id);
CREATE VECTOR INDEX Singer_vector_index ON Singers(embedding)
STORING (genre)
WHERE embedding IS NOT NULL
OPTIONS(distance_type = 'COSINE');
The following example creates a vector index Singer_vector_index on theembedding column of the Singers table and defines the distance type and search tree specifications, which are optional:
CREATE TABLE Singers(id INT64, embedding ARRAY<FLOAT32>(vector_length=>128))
PRIMARY KEY(id);
CREATE VECTOR INDEX Singer_vector_index ON Singers(embedding)
STORING (genre)
WHERE embedding IS NOT NULL
OPTIONS(distance_type = 'COSINE', tree_depth = 3, num_branches = 1000, num_leaves = 1000000);
ALTER VECTOR INDEX statement
Use the ALTER VECTOR INDEX statement to add additional stored columns or remove stored columns from the vector index.
Syntax
ALTER VECTOR INDEX indexname action
where action is: { ADD STORED COLUMN columnname | DROP STORED COLUMN columnname | SET OPTIONS ( options_def ) }
and optionsdef is: { disable_search = { true | false | null } }
Parameters
**_indexname_**
- The name of the vector index to alter.
**_columnname_**
- The name of the stored column to add or remove from the vector index.
**_optionsdef_**
- The
disable_search = trueoption prevents Spanner from using a vector index in your database. If you use theFORCE_INDEXhint to specify a vector index which has thedisable_searchoption set totrue, the query fails.
Description
Add an additional stored column into a vector index or remove a stored column from the index.
Examples
The following ALTER VECTOR INDEX statement modifies the vector index by removing the stored columngenre:
ALTER VECTOR INDEX Singer_vector_index
DROP STORED COLUMN genre;
DROP VECTOR INDEX statement
Deletes a vector index on a table.
Syntax
DROP [ VECTOR ] INDEX index_name;
Parameters
index_name: The name of the vector index to be deleted.
Example
The following example deletes the vector index Singer_vector_index:
DROP VECTOR INDEX Singer_vector_index;
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-06-15 UTC.