Cassandra Query Language (CQL)v3.3.0
本文檔描述了CQL v3。CQL v3與CQL v2不兼容且在很多地方不同。
CQL v3提供了非常類似于SQL的數據模型,數據放在了包含rows和columns的tables中。因此,當使用此文檔時,這些內容(tables,rows,columns)與SQL定義相同。但是rows和columns其內部實現的原理不同。
為了介紹CQL語法,文檔使用以下約定:
語言規則使用類BNF符號:
<start> ::= TERMINAL<non-terminal1> <non-terminal1>
非終結符號<尖括號>。
作為額外的BNF快捷符號,使用傳統的正則表達式的符號(?+and*)表示是可選的,and/or可以重復。 [<characters>]符號表示任意一個<characters>。
code塊提供了簡單code
SELECT sample_usage FROM cql;
CQL語言使用標識符(或名稱)來標識tables,columns和其他對象。一個標識符是一個令牌,與正則表達式一致[a-zA-Z][a-zA-Z0-9_]*。
一些標識符,比如SELECT或WITH,是關鍵字。他們有固定的意義且被保留的。
標識符和關鍵字是大小寫不敏感的。因此SELECT與select,sElEcT相同。使用的常常約定關鍵字大寫,標識符小寫。
CQL定義了下面類型的常量:strings,integers,floats,booleans,uuids和blobs:
CQL使用注釋:--或//
多行注釋:/* */
-- This is a comment // This is a comment too /* This is a multi-line comment */
SQL語句可以分為3類:
DDL:改變和設置數據存儲方式
DML:改變數據
Queries:查詢數據
所有語句以分號(;)結束,除了單條語句外。支持的語句如下:
<identifier> ::= any quoted or unquoted identifier, excluding reserved keywords <tablename> ::= (<identifier> '.')? <identifier> <string> ::= a string constant <integer> ::= an integer constant <float> ::= a float constant <number> ::= <integer> | <float> <uuid> ::= a uuid constant <boolean> ::= a boolean constant <hex> ::= a blob constant <constant> ::= <string> | <number>| <uuid>| <boolean> | <hex> <variable> ::= '?' | ':' <identifier> <term> ::= <constant>| <collection-literal> | <variable> | <function> '(' (<term> (',' <term>)*)? ')' <collection-literal> ::= <map-literal> | <set-literal> | <list-literal> <map-literal> ::= '{' ( <term> ':' <term> ( ',' <term> ':' <term> )* )? '}' <set-literal> ::= '{' ( <term> ( ',' <term> )* )? '}' <list-literal> ::= '[' ( <term> ( ',' <term> )* )? ']' <function> ::= <ident> <properties> ::= <property> (AND <property>)* <property> ::= <identifier> '=' ( <identifier> | <constant> | <map-literal> )
上面語法在實際中并不是所有的都是合法的。最顯著的是,<variable>和嵌套<collection-literal>在<collection-literal>中是不被允許的。
<variable>可以是匿名(一個問號?)也可以命名(在:之前的一個標識)。唯一區別就是命名更容易被引用。
<properties>用來創建或修改keyspaces和tables。每一個<properties>類型可以是simple或map。
<tablename>用來標識一個table。表示一個表名。
CQL支持prepared statements。
支持LIMIT,TIMESTAMP和TTL從句
語法:
<create-keyspace-stmt> ::= CREATE KEYSPACE (IF NOT EXISTS)? <identifier> WITH <properties>
樣例:
CREATE KEYSPACE Excelsior WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3}; CREATE KEYSPACE Excalibur WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 3} AND durable_writes = false
CREATE KEYSPACE語句用來創建一個新的頂級keyspace。Keyspace是一個命名空間,定義了復制策略和tables的其他選項集合。合法的keyspaces名稱是由數字和字母組成的,長度小于32為的標識。注意,keyspace命名是大小寫不敏感的。
CREATE KEYSPACE支持的<properties>:
name | kind | mandatory | default | description |
replication | map | yes | 復制策略和使用keyspace選項 | |
durable_writes | simple | no | true | 是否使用commit log對于更新keyspace |
replication <property>是必選的。Cassandra支持以下的‘class’
‘SimpleStrategy’:一個簡單策略,定義了簡單的復制因子在整個集群集群中。只支持‘replication_factor’一個子選項,定義復制因子且是必選項。
l ‘NetworkTopologyStrategy’:可以為每個數據中心定義單獨的復制因子。子選項以key-value方式定義,key表示數據中心名稱,value表示此數據中心的復制因子。
‘OldNetworkTopologyStrategy’: 遺留的復制策略。應該避免使用,而盡量使用‘NetworkTopologyStrategy’。
試圖創建一個已經存在的keyspace將返回一個錯誤,除非使用IF NOT EXISTS選項。如果使用它,語句將是空操作如果keyspace已經存在。
語法:
<use-stmt> ::= USE <identifier>
樣例:
USE myApp
USE語句使用已經存在的keyspace名稱作為參數,設置此keyspace作為每次連接的當前工作keyspace。
語法:
<create-keyspace-stmt> ::= ALTER KEYSPACE <identifier> WITH <properties>
樣例:
ALTER KEYSPACE Excelsior WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};
ALTERKEYSPACE語句修改keyspace的屬性。支持的<properties>與CREATE KEYSPACE相同。
語法:
<drop-keyspace-stmt> ::= DROP KEYSPACE ( IF EXISTS )? <identifier>
樣例:
DROP KEYSPACE myApp;
DROP KEYSPACE語句執行結果是,及時且不可逆的刪除keyspace,包括keyspace中的所有column families,以及包含在column families中的所有數據。
語法:
<create-table-stmt> ::= CREATE ( TABLE | COLUMNFAMILY ) ( IF NOT EXISTS )? <tablename> '(' <column-definition> ( ',' <column-definition> )* ')' ( WITH <option> ( AND <option>)* )? <column-definition> ::= <identifier> <type> ( STATIC )? ( PRIMARY KEY )? | PRIMARY KEY '(' <partition-key> ( ',' <identifier> )* ')' <partition-key> ::= <identifier> | '(' <identifier> (',' <identifier> )* ')' <option> ::= <property> | COMPACT STORAGE | CLUSTERING ORDER
樣例:
CREATE TABLE monkeySpecies ( species text PRIMARY KEY, common_name text, population varint, average_size int ) WITH comment='Important biological records' AND read_repair_chance = 1.0; CREATE TABLE timeline ( userid uuid, posted_month int, posted_time uuid, body text, posted_by text, PRIMARY KEY (userid, posted_month, posted_time) ) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };
CREATE TABLE語句創建一個新的table。每個table都是rows的集合(常常表示相關實體),定義了一些屬性。注意,CREATE COLUMNFAMILY語法是支持的,作為CREATE TABLE的別名(由于歷史原因)。
試圖創建一個已經存在的table將返回一個錯誤,除非使用IF NOT EXISTS選項。如果使用它,語句將是空操作如果table已經存在。
合法的table名稱與keyspace名稱規則相同(長度到32字符的字母數字標識符)。
CREATETABLE語句定義了table的rows所擁有的columns。column由它的名稱和類型定義。
在table內,row由PRIMARY KEY唯一標識。所以所有的table必須定義一個PRIMARY KEY。一個PRIMARY KEY可以由一個或多個columns組成。如果PRIMARY KEY只有一個column,則可以直接在此column之后定義。否則PRIMARY KEY必須逗號分割,以括號包含多個columns來定義。注意:
CREATE TABLE t ( kint PRIMARY KEY, other text )
等價于
CREATE TABLE t ( kint, other text, PRIMARY KEY (k) )
在CQL中,列的順序定義了主鍵。第一個column的key稱為partition key。所有的rows共享相同的partition key(甚至在跨表中),則存儲在相同的物理節點上。注意,可能會存在復合partition key,比如partition key由多個columns組成,使用括號包含多個columns組成partition key。
PRIMARYKEY中剩下的columns,則成為clustering columns。在給定的物理節點和給定的partition key上,clustering columns決定了存儲的順序,使得在clustering columns查詢時效率很高。
一些columns可以聲明為STATIC,column聲明為static將被擁有相同partition的所有rows共享(即擁有相同的partition key)。例如:
CREATE TABLE test ( pk int, t int, v text, s text static, PRIMARY KEY (pk, t) ); INSERT INTO test(pk, t, v, s) VALUES (0, 0, 'val0', 'static0'); INSERT INTO test(pk, t, v, s) VALUES (0, 1, 'val1', 'static1'); SELECT * FROM test WHERE pk=0 AND t=0;
最后查詢語句,s的值為‘static1’
使用static columns有以下限制:
table中COMPACT STORAGE項不能為static
一個table如果沒有clustering columns,則不能有static columns(因為table沒有clustering columns,則每個partition有且僅有一行,則每個column都是static)
只有非PRIMARY KEY的columns才能為static
CREATETABLE語句支持一些options來配置新的table。這些options被定義在WITH之后。
第一個option是COMPACT STORAGE。這個選項主要是針對向后兼容性,對于定義CQL3之前創建的table。這個選項提供了在磁盤上更緊湊的布局,但代價是減少了table的靈活性和可擴展性。最顯著的是,COMPACT STORAGE不支持collections和static columns,且COMPACT STORAGE表至少有一個clustering columns。由于這些原因,COMPACT STORAGE不建議使用。
另一個option是CLUSTERING ORDER。它允許定義rows在磁盤的順序。
表的創建支持以下的<property>:
option | kind | default | description |
comment | simple | none | 注釋 |
read_repair_chance | simple | 0.1 | 查詢額外節點的概率對于read repairs |
dclocal_read_repair_chance | simple | 0 | 查詢額外節點的概率對于本地數據中心的read repairs |
gc_grace_seconds | simple | 864000 | 等待垃圾回收的時間 |
bloom_filter_fp_chance | simple | 0.00075 | SSTable bloom filter的false positive的目標概率(降低此值將會影響bloom filter在內存和磁盤的大?。?/span> |
compaction | simple | see below | The compaction options to use, see below. |
compression | simple | see below | Compression options, see below. |
caching | simple | keys_only | 是否緩存keys(“key cache”)和rows(“row cache”)對于此table。合法的值為:all,keys_only,rows_only和none |
default_time_to_live | simple | 0 | 此table缺省的過期時間,單位為秒 |
compaction屬性為’class’子選項,定義了壓縮策略。默認支持的class為'SizeTieredCompactionStrategy' 和'LeveledCompactionStrategy'
option | supported compaction strategy | default | description |
enabled | all | true | Boolean表示compaction是否開啟 |
tombstone_threshold | all | 0.2 | 如果SSTable的gcable tombstones超過這個比率,則SSTable將會進行壓縮來清楚這些tombstones |
tombstone_compaction_interval | all | 1 day | SSTable等待時間對于“tombstone compaction”,其中“tombstone compaction”會促發壓縮,如果SSTable的gcable tombstones查過tombstone_threshold |
unchecked_tombstone_compaction | all | false | 設置true則開啟更激進的tombstone compaction,單個SSTable的tombstone compaction運行將不會檢查 |
min_sstable_size | SizeTieredCompactionStrategy | 50MB | SSTable壓縮的大小分層策略 |
min_threshold | SizeTieredCompactionStrategy | 4 | SSTable最小數量,需要開啟次要compaction |
max_threshold | SizeTieredCompactionStrategy | 32 | SSTable通過次要compaction處理的最大數量 |
bucket_low | SizeTieredCompactionStrategy | 0.5 | SSTable的bucket大小在[average_size * bucket_low, average_size * bucket_high] |
bucket_high | SizeTieredCompactionStrategy | 1.5 | SSTable的bucket大小在[average_size * bucket_low, average_size * bucket_high] |
sstable_size_in_mb | LeveledCompactionStrategy | 5MB | SSTable在leveled strategy中的大小。注意SSTable大小應該小于或等于sstable_size_in_mb |
option | default | description |
sstable_compression | LZ4Compressor | Compression算法,默認有:LZ4Compressor,SnappyCompressor和DeflateCompressor。使用string(’’)關閉Compression |
chunk_length_kb | 64KB | SSTable壓縮的塊大小。增大此值可以提高壓縮效率,但增加了從磁盤讀取數據的最小數量 |
crc_check_chance | 1.0 | 啟用壓縮時,每個壓縮塊包含一個校驗,目的是為了檢測磁盤bitrot,避免臟數據的傳播到其他副本。默認總是檢查,設置為0則關閉檢查,0.5則每隔一個讀檢查一次 |
語法:
<alter-table-stmt> ::= ALTER (TABLE | COLUMNFAMILY) <tablename> <instruction> <instruction> ::= ALTER <identifier> TYPE <type> | ADD <identifier> <type> | DROP <identifier> | WITH <option> ( AND <option> )*
樣例:
ALTER TABLE addamsFamily ALTER lastKnownLocation TYPE uuid; ALTER TABLE addamsFamily ADD gravesite varchar; ALTER TABLE addamsFamily WITH comment = 'A most excellent and useful column family' AND read_repair_chance = 0.2;
語法:
<drop-table-stmt> ::= DROP TABLE ( IF EXISTS )? <tablename>
樣例:
DROP TABLE worldSeriesAttendees;
語法:
<truncate-stmt> ::= TRUNCATE <tablename>
樣例:
TRUNCATE superImportantData;
TRUNCATE語句將會完全刪除所有table的數據
語法:
<create-index-stmt> ::= CREATE ( CUSTOM )? INDEX ( IF NOT EXISTS )? ( <indexname> )? ON <tablename> '(' <index-identifier> ')' ( USING <string> ( WITH OPTIONS = <map-literal> )? )? <index-identifier> ::= <identifier> | keys( <identifier> )
樣例:
CREATE INDEX userIndex ON NerdMovies (user); CREATE INDEX ON Mutants (abilityId); CREATE INDEX ON users (keys(favs)); CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass'; CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass' WITH OPTIONS = {'storage': '/mnt/ssd/indexes/'};
使用CREATE INDEX語句創建二次索引對于給定的column。索引的名稱可以在ON關鍵字之前定義。如果數據已經存在對于此column,則將會異步創建索引。在索引創建之后,新插入的數據將會自動索引。
試圖創建一個已經存在的index將返回一個錯誤,除非使用IF NOT EXISTS選項。如果使用它,語句將是空操作如果index已經存在。
當在map column上創建索引時,可以索引keys或values。如果column標識符放在keys()函數中,則將會在map keys上創建索引,允許在WHERE從句中使用CONTAINS KEY,否則索引將在map values上。
語法:
<drop-index-stmt> ::= DROP INDEX ( IF EXISTS )? ( <keyspace> '.' )? <identifier>
樣例:
DROP INDEX userIndex; DROP INDEX userkeyspace.address_index;
語法:
<create-type-stmt> ::= CREATE TYPE ( IF NOT EXISTS )? <typename> '(' <field-definition> ( ',' <field-definition> )* ')' <typename> ::= ( <keyspace-name> '.' )? <identifier> <field-definition> ::= <identifier> <type>
樣例:
CREATE TYPE address ( street_name text, street_number int, city text, state text, zip int ) CREATE TYPE work_and_home_addresses ( home_address address, work_address address )
CREATETYPE語句創建新的用戶定義類型。每個類型都是一組名稱,類型字段的集合。字段類型可以是任何合法類型,包含集合和其他存在的用戶定義類型
試圖創建一個已經存在的type將返回一個錯誤,除非使用IF NOT EXISTS選項。如果使用它,語句將是空操作如果type已經存在
語法:
<alter-type-stmt> ::= ALTER TYPE <typename> <instruction> <instruction> ::= ALTER <field-name> TYPE <type> | ADD <field-name> <type> | RENAME <field-name> TO <field-name> ( AND <field-name> TO <field-name> )*
樣例:
ALTER TYPE address ALTER zip TYPE varint ALTER TYPE address ADD country text ALTER TYPE address RENAME zip TO zipcode AND street_name TO street
語法:
<drop-type-stmt> ::= DROP TYPE ( IF EXISTS )? <typename>
語法:
<create-trigger-stmt> ::= CREATE TRIGGER ( IF NOT EXISTS )? ( <triggername> )? ON <tablename> USING <string>
樣例:
CREATE TRIGGER myTrigger ON myTable USING 'org.apache.cassandra.triggers.InvertedIndex';
trigger的邏輯可以使用java語言編寫,存在與外部數據庫中。放入trigger代碼在Cassandra的lib/triggers的子目錄下,當集群啟動時,會自動加載此trigger。在執行DML語句時trigger將被觸發,請確保事物的原子性。
語法:
<drop-trigger-stmt> ::= DROP TRIGGER ( IF EXISTS )? ( <triggername> )? ON <tablename>
樣例:
DROP TRIGGER myTrigger ON myTable;
語法:
<create-function-stmt> ::= CREATE ( OR REPLACE )? FUNCTION ( IF NOT EXISTS )? ( <keyspace> '.' )? <function-name> '(' <arg-name> <arg-type> ( ',' <arg-name> <arg-type> )* ')' ( CALLED | RETURNS NULL ) ON NULL INPUT RETURNS <type> LANGUAGE <language> AS <body>
樣例:
CREATE OR REPLACE FUNCTION somefunction ( somearg int, anotherarg text, complexarg frozen<someUDT>, listarg list<bigint> ) RETURNS NULL ON NULL INPUT RETURNS text LANGUAGE java AS $$ // some Java code $$; CREATE FUNCTION akeyspace.fname IF NOT EXISTS ( someArg int ) CALLED ON NULL INPUT RETURNS text LANGUAGE java AS $$ // some Java code $$;
CREATEFUNCTION會創建或替換一個用戶自定義函數。
keyspace名稱,函數名稱,參數類型是主體,大小寫敏感
CREATEFUNCTION帶著OR REPLACE選項表示創建或替換已經存在的signature。CREATE FUNCTION不帶OR REPLACE,則已經存在相同的signature會失敗。
調用帶有null的值必須在函數中聲明。有兩種選項:
RETURNS NULL ON NULL INPUT聲明函數總是返回null,如果存在任何參數為null。
CALLED ON NULL INPUT聲明函數總是會執行。
如果IF NOT EXISTS選項存在,則函數只會被創建,如果相同函數簽名不存在。
ORREPLACE和IF NOT EXISTS不能同時使用。
更多詳情請查看user-defined functions
語法:
<drop-function-stmt>::= DROP FUNCTION ( IF EXISTS )? ( <keyspace> '.')? <function-name> ( '(' <arg-type>( ',' <arg-type> )* ')' )?
樣例:
DROP FUNCTIONmyfunction; DROP FUNCTIONmykeyspace.afunction; DROP FUNCTIONafunction ( int ); DROP FUNCTIONafunction ( text );
語法:
<create-aggregate-stmt> ::= CREATE ( OR REPLACE )? AGGREGATE ( IF NOT EXISTS )? ( <keyspace> '.' )? <aggregate-name> '(' <arg-type> ( ',' <arg-type> )* ')' SFUNC ( <keyspace> '.' )? <state-functionname> STYPE <state-type> ( FINALFUNC ( <keyspace> '.' )? <final-functionname> )? ( INITCOND <init-cond> )?
樣例:
CREATE AGGREGATE myaggregate ( val text ) SFUNC myaggregate_state STYPE text FINALFUNC myaggregate_final INITCOND 'foo';
更多詳情請查看user-defined aggregates
STYPE定義了正式的值的類型,必須被聲明。
選項INITCOND定義了aggregate的初始化狀態值。默認為null。
SFUNC引用現有的函數作為正式的修改函數。函數第一個參數類型必須與STYPE匹配。函數剩下的參數類型必須匹配聚合函數的參數類型。
FINALFUNC在聚合結果返回之前調用。它必須帶有一個STYPE類型的參數。FINALFUNC返回類型可以是不同的類型。FINALFUNC函數聲明帶有RETURNS NULL ON NULL INPUT意味著聚合返回值將會是null。
如果沒有定義FINALFUNC,聚合函數返回類型為STYPE。如果定義了FINALFUNC,則返回此函數類型
語法:
<drop-aggregate-stmt> ::= DROP AGGREGATE ( IF EXISTS )? ( <keyspace> '.' )? <aggregate-name> ( '(' <arg-type> ( ',' <arg-type> )* ')' )?
樣例:
DROP AGGREGATE myAggregate; DROP AGGREGATE myKeyspace.anAggregate; DROP AGGREGATE someAggregate ( int ); DROP AGGREGATE someAggregate ( text );
語法:
<insertStatement> ::= INSERT INTO <tablename> ( ( <name-list> VALUES <value-list> ) | ( JSON <string> )) ( IF NOT EXISTS )? ( USING <option> ( AND <option> )* )? <names-list> ::= '(' <identifier> ( ',' <identifier> )* ')' <value-list> ::= '(' <term-or-literal> ( ',' <term-or-literal> )* ')' <term-or-literal> ::= <term> | <collection-literal> <option> ::= TIMESTAMP <integer> | TTL <integer>
樣例:
INSERT INTO NerdMovies (movie, director, main_actor, year) VALUES ('Serenity', 'Joss Whedon', 'Nathan Fillion', 2005) USING TTL 86400; INSERT INTO NerdMovies JSON '{"movie": "Serenity", "director": "Joss Whedon", "year": 2005}'
INSERT語句寫入一個或多個columns對于在table中給定的row。
當使用VALUES語法時,columns列表必須提供。當使用JSON語法時,columns列表是可選的。
注意,與SQL不同,INSERT不會檢查row是否存在:當不存在則創建,否則更新。
但是當使用IF NOT EXISTS時,只會進行插入操作當row不存在時。注意,使用IF NOT EXISTS將會引來不可忽略的性能問題(內部使用Paxos算法),所以盡量少用
<option>請參考update部分。同樣注意INSERT不支持counters,而UPDATE支持。
語法:
<update-stmt> ::= UPDATE <tablename> ( USING <option> ( AND <option> )* )? SET <assignment> ( ',' <assignment> )* WHERE <where-clause> ( IF <condition> ( AND condition )* )? <assignment> ::= <identifier> '=' <term> | <identifier> '=' <identifier> ('+' | '-') (<int-term> | <set-literal> | <list-literal>) | <identifier> '=' <identifier> '+' <map-literal> | <identifier> '[' <term> ']' '=' <term> <condition> ::= <identifier> '=' <term> | <identifier> '[' <term> ']' '=' <term> <where-clause> ::= <relation> ( AND <relation> )* <relation> ::= <identifier> '=' <term> | <identifier> IN '(' ( <term> ( ',' <term> )* )? ')' | <identifier> IN '?' <option> ::= TIMESTAMP <integer> | TTL <integer>
樣例:
UPDATE NerdMovies USING TTL 400 SET director = 'Joss Whedon', main_actor = 'Nathan Fillion', year = 2005 WHERE movie = 'Serenity'; UPDATE UserActions SET total = total + 2 WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14 AND action = 'click';
UPDATE語句寫入一個或多個columns對于給定的row。<where-clause>用來查詢更新的row,必須包含組成PRIMARY KEY的所有的columns(IN只支持partition key的最后一個column)。其他columns值通過<assignment>指定在SET關鍵字之后。
注意,與SQL不同,UPDATE不會檢查row是否存在:當不存在則創建,否則更新。
如果使用了IF條件,則必須同時滿足IF條件才會更新。使用IF將會引來不可忽略的性能問題(內部使用Paxos算法),所以盡量少用
<assignment>的c = c + 3的格式表示增加/減少counters(counters只支持增加/減少,而不支持賦予特定的值)。
UPDATE和INSERT支持下面的選項:
TIMESTAMP:設置操作的timestamp。如果沒有指定,則coordinator將會使用當前時間(單位毫秒)。
TTL:允許指定插入值的存活事件(單位秒)。如果設置了,則在指定時間之后,數據庫將自動刪除。注意,TTL關注點為插入的值,這意味著后面的更新將會重置TTL。默認地,值永遠不會過期。TTL為0或負數等價于沒有TTL。
語法:
<delete-stmt> ::= DELETE ( <selection> ( ',' <selection> )* )? FROM <tablename> ( USING TIMESTAMP <integer>)? WHERE <where-clause> ( IF ( EXISTS | ( <condition> ( AND <condition> )*) ) )? <selection> ::= <identifier> ( '[' <term> ']' )? <where-clause> ::= <relation> ( AND <relation> )* <relation> ::= <identifier> '=' <term> | <identifier> IN '(' ( <term> ( ',' <term> )* )? ')' | <identifier> IN '?' <condition> ::= <identifier> '=' <term> | <identifier> '[' <term> ']' '=' <term>
樣例:
DELETE FROM NerdMovies USING TIMESTAMP 1240003134 WHERE movie = 'Serenity'; DELETE phone FROM Users WHERE userid IN (C73DE1D3-AF08-40F3-B124-3FF3E5109F22, B70DE1D0-9908-4AE3-BE34-5573E5B09F14);
DELETE語句刪除columns和rows。<where-clause>可以指定key的rows被刪除(IN只支持partition key的最后一個column)。
DELETE支持的TIMESTAMP選項與UPDATE相同。
DELETE操作可以使用與UPDATE和INSERT類似IF條件。但是注意,使用IF將會引來不可忽略的性能問題(內部使用Paxos算法),所以盡量少用
語法:
<batch-stmt> ::= BEGIN ( UNLOGGED | COUNTER ) BATCH ( USING <option> ( AND <option> )* )? <modification-stmt> ( ';' <modification-stmt> )* APPLY BATCH <modification-stmt> ::= <insert-stmt> | <update-stmt> | <delete-stmt> <option> ::= TIMESTAMP <integer>
樣例:
BEGIN BATCH INSERT INTO users (userid, password, name) VALUES ('user2', 'ch@ngem3b', 'second user'); UPDATE users SET password = 'ps22dhds' WHERE userid = 'user3'; INSERT INTO users (userid, password) VALUES ('user4', 'ch@ngem3c'); DELETE name FROM users WHERE userid = 'user1'; APPLY BATCH;
BATCH語句組合多個語句(插入,修改和刪除)到一條語句中。有以下一個目的:
當批量更新時,保存了client和server網絡連接
所有的批量更新屬于給定的partition key,被單獨執行。
默認,所有批量操作被自動完成。
注意:
BATCH語句只能包含UPDATE,INSERT和DELETE語句。
Batches不完全類似與SQL事物。
如果每個操作沒有指定timestamp,則所有操作將使用同一個timestamp。
默認地,Cassandra使用batch log來確保所有的操作自動批處理執行。
當batch跨越多個partitions時,會帶來性能損失。如果你不想引來此損失,可以使用UNLOGGED選項來告訴Cassandra跳過batch log。如果使用UNLOGGED,則操作將會在一個partition中執行。
使用COUNTER選項來批量更新counter。不像Cassandra的其他更新,counter更新不是冪等的。
BATCH也支持TIMESTAMP選項,與UPDATE語句描述類似。但是如果使用的話,TIMESTAMP則不能夠在batch內部的語句使用
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。