日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

UPSERT是INSERT與UPDATE的結(jié)合語(yǔ)法,表示行存在時(shí)執(zhí)行UPDATE,不存在時(shí)執(zhí)行INSERT。執(zhí)行UPSERT操作時(shí)必須指定完整的PRIMARY KEY的相關(guān)列信息。UPSERT語(yǔ)法支持帶時(shí)間戳的數(shù)據(jù)寫(xiě)入和批量寫(xiě)入,其中的UPSERT謂詞也可用INSERT來(lái)替代。

引擎與版本

UPSERT語(yǔ)法適用于寬表引擎和時(shí)序引擎。無(wú)版本限制。

與關(guān)系型數(shù)據(jù)庫(kù)寫(xiě)入的區(qū)別

Lindorm的UPSERT語(yǔ)句寫(xiě)入數(shù)據(jù)的效果與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的寫(xiě)入效果存在以下不同:

  • 傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)

    如果表定義了PRIMARY KEY,那么當(dāng)連續(xù)兩次寫(xiě)入相同PRIMARY KEY的數(shù)據(jù)時(shí)(使用INSERT語(yǔ)句且不帶ON DUPLICATE KEY子句),第二次寫(xiě)入會(huì)失敗。此時(shí)需要執(zhí)行UPDATE語(yǔ)句,或在第二次執(zhí)行INSERT語(yǔ)句時(shí),在語(yǔ)句中帶上ON DUPLICATE KEY子句。

  • Lindorm

    • 寬表引擎:使用UPSERT語(yǔ)句寫(xiě)入數(shù)據(jù)時(shí),即使連續(xù)兩次寫(xiě)入的PRIMARY KEY相同,第二次寫(xiě)入數(shù)據(jù)時(shí)也不會(huì)報(bào)錯(cuò),而是覆蓋UPSERT涉及的數(shù)據(jù)。實(shí)際上,Lindorm會(huì)將兩次寫(xiě)入的數(shù)據(jù)保存為兩個(gè)版本,當(dāng)使用SELECT語(yǔ)句查詢(xún)某行數(shù)據(jù)時(shí),默認(rèn)返回最新版本的數(shù)據(jù)。

    • 時(shí)序引擎:使用UPSERT語(yǔ)句寫(xiě)入數(shù)據(jù)時(shí),連續(xù)兩次寫(xiě)入的PRIMARY KEY相同,則第二次寫(xiě)入的數(shù)據(jù)將直接覆蓋第一次寫(xiě)入的數(shù)據(jù)。

使用UPSERT語(yǔ)句連續(xù)兩次寫(xiě)入相同PRIMARY KEY數(shù)據(jù)的示例,請(qǐng)參見(jiàn)寫(xiě)入相同PRIMARY KEY的數(shù)據(jù)

語(yǔ)法

upsert_statement   ::= { UPSERT | INSERT } [ hint_expression ] 
                       INTO table_identifier columns_delaration
                       VALUES value_list ( ',' value_list)*
                       [ ON DUPLICATE KEY column_identifier = 
                         value_literal | IGNORE ]
columns_delaration ::=  '(' column_identifier ( ',' column_identifier)* ')'
value_list         ::=  '(' value_expression( ',' value_expression)* ')'

使用說(shuō)明

HINT表達(dá)式(hint_expression

寬表引擎支持HINT表達(dá)式。

支持在UPSERT語(yǔ)句中添加HINT參數(shù)_l_ts_,用于指定寫(xiě)入數(shù)據(jù)的時(shí)間戳。_l_ts_參數(shù)的詳細(xì)介紹,請(qǐng)參見(jiàn)hintOption參數(shù)說(shuō)明

ON DUPLICATE KEY

寬表引擎支持ON DUPLICATE KEY子句。

ON DUPLICATE KEY子句用于檢查指定行是否已存在,類(lèi)似于HBase中的checkAndPut操作,具體規(guī)則如下:

  • ON DUPLICATE KEY子句后跟隨UPDATE,用于更新某一列的值。如果指定行已存在,則執(zhí)行UPDATE關(guān)鍵字后的語(yǔ)句,更新指定列的值;如果指定行不存在,則既不報(bào)錯(cuò)也不更新指定列的值。例如ON DUPLICATE KEY UPDATE c1 = 20是指如果指定行已存在,則將c1列的值更新為20;如果指定行不存在則不更新也不報(bào)錯(cuò)。

  • ON DUPLICATE KEY子句后跟隨IGNORE時(shí),如果指定行已存在,則既不報(bào)錯(cuò)也不寫(xiě)入;如果指定行不存在,則直接將數(shù)據(jù)寫(xiě)入。

  • 僅支持CONSISTENCYstrong的表。CONSISTENCY參數(shù)的詳細(xì)介紹,請(qǐng)參見(jiàn)表屬性(table_options)。如果您想要更改CONSISTENCY參數(shù)的值,請(qǐng)參見(jiàn)ALTER TABLE

示例

假設(shè)示例表sensor的結(jié)構(gòu)如下:

CREATE TABLE sensor (
    device_id VARCHAR NOT NULL,
    region VARCHAR NOT NULL,
    time TIMESTAMP NOT NULL,
    temperature DOUBLE,
    humidity BIGINT,
    PRIMARY KEY(device_id, region, time)
)WITH(VERSIONS=2);

寫(xiě)入數(shù)據(jù)

UPSERT INTO sensor(device_id, region, time, temperature, humidity) VALUES('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45);

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

部分列寫(xiě)入數(shù)據(jù)

UPSERT INTO sensor(device_id, region, time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:10',13.2);

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

數(shù)據(jù)已存在時(shí),忽略寫(xiě)入(ON DUPLICATE KEY IGNORE

在寬表引擎中,使用ON DUPLICATE KEY IGNORE子句寫(xiě)入數(shù)據(jù):

如果device_id='F07A1260',region='north-cn',time='2021-04-22 15:33:10',temperature=13.2的行存在,則不寫(xiě)入數(shù)據(jù);如果該行不存在,寫(xiě)入數(shù)據(jù)。

UPSERT INTO sensor(device_id,region,time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:10',13.2) ON DUPLICATE KEY IGNORE;

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

數(shù)據(jù)已存在時(shí),更新寫(xiě)入(ON DUPLICATE KEY UPDATE)

在寬表引擎中,使用ON DUPLICATE KEY UPDATE子句寫(xiě)入數(shù)據(jù):

如果device_id='F07A1260',region='north-cn',time='2021-04-22 15:33:10',temperature=13.2的行存在,更新temperature列的值為30;如果該行不存在,既不更新temperature列的值也不報(bào)錯(cuò)。

UPSERT INTO sensor(device_id,region,time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:10',13.2) ON DUPLICATE KEY UPDATE temperature = 30;

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

寫(xiě)入帶有時(shí)間戳的數(shù)據(jù)

在寬表引擎,向表sensor中寫(xiě)入一行數(shù)據(jù),并設(shè)置時(shí)間戳為111232。

UPSERT /*+ _l_ts_(111232) */ INTO sensor (device_id ,region ,time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:00',12.1);

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

批量寫(xiě)入數(shù)據(jù)

UPSERT INTO sensor (device_id ,region ,time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:20',10.6), ('F07A1261','south-cn','2021-04-22 15:33:00',18.1), ('F07A1261','south-cn','2021-04-22 15:33:10',19.7);

結(jié)果驗(yàn)證

您可以執(zhí)行SELECT * FROM sensor;查看數(shù)據(jù)是否寫(xiě)入成功。

寫(xiě)入相同PRIMARY KEY的數(shù)據(jù)

在寬表引擎中,使用UPSERT語(yǔ)句連續(xù)兩次寫(xiě)入相同PRIMARY KEY的數(shù)據(jù),并通過(guò)HINT查詢(xún)寫(xiě)入結(jié)果。

說(shuō)明

時(shí)序引擎連續(xù)兩次寫(xiě)入的PRIMARY KEY相同,第二次寫(xiě)入的數(shù)據(jù)將直接覆蓋第一次寫(xiě)入的數(shù)據(jù)。

  1. 第一次寫(xiě)入數(shù)據(jù)。

    UPSERT INTO sensor(device_id ,region ,time,temperature,humidity) VALUES('F07A1260','north-cn','2021-04-22 15:33:10',13.2,45); 
  2. 查詢(xún)寫(xiě)入結(jié)果。

    SELECT * FROM sensor WHERE device_id='F07A1260' AND region='north-cn'; 

    返回結(jié)果:

    +-----------+----------+-------------------------------+-------------+----------+
    | device_id |  region  |             time              | temperature | humidity |
    +-----------+----------+-------------------------------+-------------+----------+
    | F07A1260  | north-cn | 2021-04-22 15:33:10 +0000 UTC | 13.2        | 45       |
    +-----------+----------+-------------------------------+-------------+----------+
  3. 第二次寫(xiě)入數(shù)據(jù)。

    UPSERT INTO sensor(device_id ,region ,time,temperature,humidity) VALUES('F07A1260','north-cn','2021-04-22 15:33:10',16.7,52); 
  4. 查詢(xún)第二次寫(xiě)入后的結(jié)果。

    SELECT * FROM sensor WHERE device_id='F07A1260' AND region='north-cn'; 

    返回結(jié)果:

    +-----------+----------+-------------------------------+-------------+----------+
    | device_id |  region  |             time              | temperature | humidity |
    +-----------+----------+-------------------------------+-------------+----------+
    | F07A1260  | north-cn | 2021-04-22 15:33:10 +0000 UTC | 16.7        | 52       |
    +-----------+----------+-------------------------------+-------------+----------+

    通過(guò)返回結(jié)果可以看到,兩次寫(xiě)入數(shù)據(jù)時(shí),主鍵列device_id、region和time中的數(shù)據(jù)相同,最終temperature列第一次寫(xiě)入的數(shù)據(jù)被第二次寫(xiě)入的數(shù)據(jù)覆蓋。

  5. 通過(guò)HINT查詢(xún)所有版本的數(shù)據(jù)。

    SELECT /*+ _l_versions_(2)  */ device_id, region, time,temperature,humidity FROM sensor WHERE device_id='F07A1260';

    返回結(jié)果:

    +-----------+----------+-------------------------------+-------------+----------+
    | device_id |  region  |             time              | temperature | humidity |
    +-----------+----------+-------------------------------+-------------+----------+
    | F07A1260  | north-cn | 2021-04-22 15:33:10 +0000 UTC | 16.7        | 52       |
    | F07A1260  | north-cn | 2021-04-22 15:33:10 +0000 UTC | 13.2        | 45       |
    +-----------+----------+-------------------------------+-------------+----------+

    通過(guò)返回結(jié)果可以看到,UPSERT語(yǔ)句實(shí)際是將兩次寫(xiě)入的數(shù)據(jù)保存為了兩個(gè)版本。