已合并
[Doc] doc of pg generated as identity #8611
XXXCA创建于 4月29日
[Doc] doc of pg generated as identity #8611
已合并
共 19 个文件变更+1207-149
| @@ -190,5 +190,19 @@ PG\_ATTRIBUTE系统表存储关于表字段的信息。 | |||
| 190 | <p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a>3. ATT_KV_TIMETAG :时间列</p> | 190 | <p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a>3. ATT_KV_TIMETAG :时间列</p> |
| 191 | </td> | 191 | </td> |
| 192 | </tr> | 192 | </tr> |
| 193 | +<tr id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_row1718431494418"><td class="cellrowborder" valign="top" width="14.499999999999998%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a>attdroppedname</p> | ||
| 194 | +</td> | ||
| 195 | +<td class="cellrowborder" valign="top" width="17.919999999999998%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a>name</p> | ||
| 196 | +</td> | ||
| 197 | +<td class="cellrowborder" valign="top" width="67.58%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a>被删除前的字段名</p> | ||
| 198 | +</td> | ||
| 199 | +</tr> | ||
| 200 | +<tr id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_row1718431494418"><td class="cellrowborder" valign="top" width="14.499999999999998%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a>attidentity</p> | ||
| 201 | +</td> | ||
| 202 | +<td class="cellrowborder" valign="top" width="17.919999999999998%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a>char</p> | ||
| 203 | +</td> | ||
| 204 | +<td class="cellrowborder" valign="top" width="67.58%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a>某一列的identity属性, 取值为'a','d'或者'm'</p> | ||
| 205 | +</td> | ||
| 206 | +</tr> | ||
| 193 | </tbody> | 207 | </tbody> |
| 194 | </table> | 208 | </table> |
| @@ -30,6 +30,7 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 30 | 30 | ||
| 31 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 | 31 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 |
| 32 | - filegroup为任意字符串,支持通过[]包裹。 | 32 | - filegroup为任意字符串,支持通过[]包裹。 |
| 33 | +- 新增支持为列添加identity属性的语法。 | ||
| 33 | 34 | ||
| 34 | ## 语法格式<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s58bdce220c9f4292ba9af919b04ad25c"></a> | 35 | ## 语法格式<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s58bdce220c9f4292ba9af919b04ad25c"></a> |
| 35 | 36 | ||
| @@ -89,21 +90,23 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 89 | 90 | ||
| 90 | ``` | 91 | ``` |
| 91 | [ CONSTRAINT constraint_name ] | 92 | [ CONSTRAINT constraint_name ] |
| 92 | - { NOT NULL | | 93 | + { NOT NULL | |
| 93 | - NULL | | 94 | + NULL | |
| 94 | - CHECK ( expression ) | | 95 | + CHECK ( expression ) | |
| 95 | - DEFAULT default_expr | | 96 | + DEFAULT default_expr | |
| 96 | - GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 97 | + IDENTITY [ ( seed, increment ) ] | |
| 97 | - AUTO_INCREMENT | | 98 | + GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 98 | - ON UPDATE update_expr | | 99 | + ON UPDATE update_expr | |
| 99 | - UNIQUE [KEY] index_parameters [ ON filegroup ] | | 100 | + { UNIQUE [KEY] index_parameters [ ON filegroup ] | |
| 100 | - PRIMARY KEY index_parameters [ ON filegroup ] | | 101 | + PRIMARY KEY index_parameters [ ON filegroup ] |
| 101 | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | 102 | + } [ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] | |
| 102 | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] | 103 | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] |
| 103 | - [ ON DELETE action ] [ ON UPDATE action ] } | 104 | + [ ON DELETE action ] [ ON UPDATE action ] [ ENABLE ] | |
| 104 | - [ ENABLE [VALIDATE | NOVALIDATE] | DISABLE [VALIDATE | NOVALIDATE] ] | 105 | + { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] Constraint constraint_name | |
| 105 | - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | 106 | + DEFAULT (expression) FOR (column_name) } | |
| 106 | - DEFAULT (expression) FOR (column_name) | 107 | + AUTO_INCREMENT | |
| 108 | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | ||
| 109 | + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | ||
| 107 | [ COMMENT 'text' ] | 110 | [ COMMENT 'text' ] |
| 108 | ``` | 111 | ``` |
| 109 | 112 | ||
| @@ -211,22 +214,27 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 211 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 | 214 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 |
| 212 | - filegroup为任意字符串,支持通过[]包裹。 | 215 | - filegroup为任意字符串,支持通过[]包裹。 |
| 213 | 216 | ||
| 214 | -- **DEFAULT (expression) FOR (column_name)** | 217 | +- **DEFAULT \( expression \) FOR \( column\_name \)** |
| 215 | 218 | ||
| 216 | - 该语法可以为指定列添加DEFAULT约束,该约束为一个表达式。 | 219 | - 该语法可以为指定列添加DEFAULT约束,该约束为一个表达式。 |
| 217 | - 对于显式声明约束名的场景,仅做语法支持,使用该语法创建的DEFAULT约束无法通过约束名进行删除。 | 220 | - 对于显式声明约束名的场景,仅做语法支持,使用该语法创建的DEFAULT约束无法通过约束名进行删除。 |
| 218 | 221 | ||
| 219 | -## opt\_clustered示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 222 | +- **IDENTITY \[ ( seed, increment ) \]** |
| 220 | 223 | ||
| 221 | -``` | 224 | + - 该语法为列添加identity属性,序列值递增,`seed`指定起始值,`increment`指定步长。 |
| 225 | + - 一张表只能定义一列(包括generated as identity)。 | ||
| 226 | + | ||
| 227 | +## opt\_clustered示例 | ||
| 228 | + | ||
| 229 | +```sql | ||
| 222 | openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT); | 230 | openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT); |
| 223 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_a UNIQUE CLUSTERED (a); | 231 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_a UNIQUE CLUSTERED (a); |
| 224 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a); | 232 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a); |
| 225 | ``` | 233 | ``` |
| 226 | 234 | ||
| 227 | -## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 235 | +## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 |
| 228 | 236 | ||
| 229 | -``` | 237 | +```sql |
| 230 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); | 238 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); |
| 231 | NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1" | 239 | NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1" |
| 232 | 240 | ||
| @@ -251,9 +259,9 @@ NOTICE: parameter "data_compression" is currently ignored. | |||
| 251 | NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3" | 259 | NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3" |
| 252 | ``` | 260 | ``` |
| 253 | 261 | ||
| 254 | -## filegroup示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 262 | +## filegroup示例 |
| 255 | 263 | ||
| 256 | -``` | 264 | +```sql |
| 257 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); | 265 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); |
| 258 | 266 | ||
| 259 | alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1]; | 267 | alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1]; |
| @@ -269,9 +277,44 @@ create table test3(col1 int, col2 int); | |||
| 269 | alter table test3 add column col3 int primary key with (data_compression = none) on [primar4]; | 277 | alter table test3 add column col3 int primary key with (data_compression = none) on [primar4]; |
| 270 | ``` | 278 | ``` |
| 271 | 279 | ||
| 272 | -## DEFAULT (expression) FOR (column_name) 示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 280 | +## IDENTITY \[ \( seed, increment \) \] 示例 |
| 281 | +```sql | ||
| 282 | +openGauss=# create extension shark; | ||
| 283 | +CREATE EXTENSION | ||
| 284 | +openGauss=# create table t1 (a int identity(10, 20), b int); | ||
| 285 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq_identity" for serial column "t1.a" | ||
| 286 | +CREATE TABLE | ||
| 287 | +openGauss=# \d+ t1 | ||
| 288 | + Table "public.t1" | ||
| 289 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 290 | +--------+---------+-------------------+---------+--------------+------------- | ||
| 291 | + a | integer | not null identity | plain | | | ||
| 292 | + b | integer | | plain | | | ||
| 293 | +Has OIDs: no | ||
| 294 | +Options: orientation=row, compression=no, collate=1537 | ||
| 295 | +Character Set: UTF8 | ||
| 296 | +Collate: utf8mb4_general_ci | ||
| 297 | + | ||
| 298 | +openGauss=# alter table t1 alter column b add identity ; | ||
| 299 | +NOTICE: ALTER TABLE will create implicit sequence "t1_b_seq_identity" for serial column "t1.b" | ||
| 300 | +ERROR: Multiple identity columns specified for table "t1". Only one identity column per table is allowed. | ||
| 301 | +openGauss=# create table t2 (a int, b int); | ||
| 302 | +CREATE TABLE | ||
| 303 | +openGauss=# alter table t2 alter column b add identity ; | ||
| 304 | +NOTICE: ALTER TABLE will create implicit sequence "t2_b_seq_identity" for serial column "t2.b" | ||
| 305 | +ERROR: column "b" of relation "t2" must be declared NOT NULL before identity can be added | ||
| 306 | +openGauss=# alter table t2 alter column b set not null; | ||
| 307 | +ALTER TABLE | ||
| 308 | +openGauss=# alter table t2 alter column b add identity ; | ||
| 309 | +NOTICE: ALTER TABLE will create implicit sequence "t2_b_seq_identity" for serial column "t2.b" | ||
| 310 | +ALTER TABLE | ||
| 311 | +openGauss=# | ||
| 273 | 312 | ||
| 274 | ``` | 313 | ``` |
| 314 | + | ||
| 315 | +## DEFAULT (expression) FOR (column_name) 示例 | ||
| 316 | + | ||
| 317 | +```sql | ||
| 275 | openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float); | 318 | openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float); |
| 276 | CREATE TABLE | 319 | CREATE TABLE |
| 277 | openGauss=# \d+ ADD_DEFAULT | 320 | openGauss=# \d+ ADD_DEFAULT |
| @@ -64,6 +64,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 64 | NULL | | 64 | NULL | |
| 65 | CHECK ( expression ) | | 65 | CHECK ( expression ) | |
| 66 | DEFAULT default_expr | | 66 | DEFAULT default_expr | |
| 67 | + IDENTITY [ ( seed, increment ) ] | | ||
| 67 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 68 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 68 | AS ( generation_expr ) [PERSISTED] | | 69 | AS ( generation_expr ) [PERSISTED] | |
| 69 | AUTO_INCREMENT | | 70 | AUTO_INCREMENT | |
| @@ -101,6 +102,11 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 101 | 102 | ||
| 102 | ## 参数说明 | 103 | ## 参数说明 |
| 103 | 104 | ||
| 105 | +- **IDENTITY \[ \( seed, increment \) \]** | ||
| 106 | + | ||
| 107 | + - 该语法为列添加identity属性,序列值递增,`seed`指定起始值,`increment`指定步长。 | ||
| 108 | + - 一张表只能定义一列(包括generated as identity)。 | ||
| 109 | + | ||
| 104 | - **AS \( generation\_expr \) \[PERSISTED\]** | 110 | - **AS \( generation\_expr \) \[PERSISTED\]** |
| 105 | 111 | ||
| 106 | 该子句为兼容D库的语法,将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,PERSISTED表示像普通列一样存储生成列的值。 | 112 | 该子句为兼容D库的语法,将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,PERSISTED表示像普通列一样存储生成列的值。 |
| @@ -234,6 +240,40 @@ opengauss=# ALTER TABLE Products DROP unitprice; | |||
| 234 | ALTER TABLE | 240 | ALTER TABLE |
| 235 | ``` | 241 | ``` |
| 236 | 242 | ||
| 243 | +## IDENTITY \[ \( seed, increment \) \] 示例 | ||
| 244 | +```sql | ||
| 245 | +openGauss=# create extension shark; | ||
| 246 | +CREATE EXTENSION | ||
| 247 | +openGauss=# create table t1 (a int identity(10, 20), b int); | ||
| 248 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq_identity" for serial column "t1.a" | ||
| 249 | +CREATE TABLE | ||
| 250 | +openGauss=# \d+ t1 | ||
| 251 | + Table "public.t1" | ||
| 252 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 253 | +--------+---------+-------------------+---------+--------------+------------- | ||
| 254 | + a | integer | not null identity | plain | | | ||
| 255 | + b | integer | | plain | | | ||
| 256 | +Has OIDs: no | ||
| 257 | +Options: orientation=row, compression=no, collate=1537 | ||
| 258 | +Character Set: UTF8 | ||
| 259 | +Collate: utf8mb4_general_ci | ||
| 260 | + | ||
| 261 | +openGauss=# insert into t1(b) values(10); | ||
| 262 | +INSERT 0 1 | ||
| 263 | +openGauss=# insert into t1(a, b) overriding system value values(12, 10); | ||
| 264 | +INSERT 0 1 | ||
| 265 | +openGauss=# insert into t1 default values; | ||
| 266 | +INSERT 0 1 | ||
| 267 | +openGauss=# select * from t1; | ||
| 268 | + a | b | ||
| 269 | +----+---- | ||
| 270 | + 10 | 10 | ||
| 271 | + 12 | 10 | ||
| 272 | + 30 | | ||
| 273 | +(3 rows) | ||
| 274 | + | ||
| 275 | +``` | ||
| 276 | + | ||
| 237 | ## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 | 277 | ## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 |
| 238 | 278 | ||
| 239 | ```sql | 279 | ```sql |
| @@ -326,7 +366,7 @@ openGauss=# CREATE TEMPORARY TABLE #ltt1 | |||
| 326 | ADDRESS VARCHAR(50) , | 366 | ADDRESS VARCHAR(50) , |
| 327 | POSTCODE CHAR(6) | 367 | POSTCODE CHAR(6) |
| 328 | ) ON COMMIT PRESERVE ROWS; | 368 | ) ON COMMIT PRESERVE ROWS; |
| 329 | - | 369 | +CREATE TABLE |
| 330 | openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 | 370 | openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 |
| 331 | ( | 371 | ( |
| 332 | ID INTEGER NOT NULL, | 372 | ID INTEGER NOT NULL, |
| @@ -334,7 +374,7 @@ openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 | |||
| 334 | ADDRESS VARCHAR(50) , | 374 | ADDRESS VARCHAR(50) , |
| 335 | POSTCODE CHAR(6) | 375 | POSTCODE CHAR(6) |
| 336 | ) ON COMMIT PRESERVE ROWS; | 376 | ) ON COMMIT PRESERVE ROWS; |
| 337 | - | 377 | +CREATE TABLE |
| 338 | ``` | 378 | ``` |
| 339 | 379 | ||
| 340 | ## 相关链接<a name="section156744489391"></a> | 380 | ## 相关链接<a name="section156744489391"></a> |
| @@ -14,6 +14,7 @@ | |||
| 14 | ``` | 14 | ``` |
| 15 | [ WITH [ RECURSIVE ] with_query [, ...] ] | 15 | [ WITH [ RECURSIVE ] with_query [, ...] ] |
| 16 | INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ] | 16 | INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ] |
| 17 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 17 | { DEFAULT VALUES | 18 | { DEFAULT VALUES |
| 18 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 19 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] |
| 19 | | query } | 20 | | query } |
| @@ -45,9 +46,16 @@ INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [tab | |||
| 45 | 46 | ||
| 46 | - 针对hint,会打印相关NOTICE信息。 | 47 | - 针对hint,会打印相关NOTICE信息。 |
| 47 | 48 | ||
| 48 | -## table_hint子句示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 49 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** |
| 49 | 50 | ||
| 50 | -``` | 51 | + 该子句用于插入identity列时的行为控制。 |
| 52 | + | ||
| 53 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 54 | + - 当开启`identity_insert`时可以插入用户值(包括default),否则只有使用`OVERRIDING SYSTEM VALUE`才能插入用户值,而insert overriding user value会忽略用户的值采用序列的值。 | ||
| 55 | + | ||
| 56 | +## table_hint子句示例 | ||
| 57 | + | ||
| 58 | +```sql | ||
| 51 | create table t1(c1 int, c2 int); | 59 | create table t1(c1 int, c2 int); |
| 52 | 60 | ||
| 53 | insert into t1 values(1, 2); | 61 | insert into t1 values(1, 2); |
| @@ -111,6 +119,62 @@ NOTICE: The nolock option is currently ignored | |||
| 111 | NOTICE: The nowait option is currently ignored | 119 | NOTICE: The nowait option is currently ignored |
| 112 | ``` | 120 | ``` |
| 113 | 121 | ||
| 122 | +## identity_insert 与 OVERRIDING clause 示例 | ||
| 123 | +```sql | ||
| 124 | +openGauss=# create extension shark; | ||
| 125 | +CREATE EXTENSION | ||
| 126 | +openGauss=# CREATE TABLE book(bookId int IDENTITY, bookname NVARCHAR(50), author NVARCHAR(50)); | ||
| 127 | +NOTICE: CREATE TABLE will create implicit sequence "book_bookid_seq_identity" for serial column "book.bookid" | ||
| 128 | +CREATE TABLE | ||
| 129 | +openGauss=# \d+ book | ||
| 130 | + Table "public.book" | ||
| 131 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 132 | +----------+---------------+-----------------------------------------------+----------+--------------+------------- | ||
| 133 | + bookid | integer | not null identity | plain | | | ||
| 134 | + bookname | nvarchar2(50) | character set UTF8 collate utf8mb4_general_ci | extended | | | ||
| 135 | + author | nvarchar2(50) | character set UTF8 collate utf8mb4_general_ci | extended | | | ||
| 136 | +Has OIDs: no | ||
| 137 | +Options: orientation=row, compression=no, collate=1537 | ||
| 138 | +Character Set: UTF8 | ||
| 139 | +Collate: utf8mb4_general_ci | ||
| 140 | + | ||
| 141 | +openGauss=# set identity_insert = off; | ||
| 142 | +SET | ||
| 143 | +openGauss=# INSERT INTO book VALUES (2, 'xxx', 'xxx'); -- error; | ||
| 144 | +ERROR: INSERT has more expressions than target columns | ||
| 145 | +LINE 1: INSERT INTO book VALUES (2, 'xxx', 'xxx'); | ||
| 146 | + ^ | ||
| 147 | +openGauss=# INSERT INTO book (bookid, bookname, author) VALUES(11111, 'xxxx', 'xxx'); -- error, turn on identity_insert or use OVERRIDING | ||
| 148 | +ERROR: cannot insert a non-DEFAULT value into column "bookid" | ||
| 149 | +DETAIL: Column "bookid" is an identity column defined as "IDENTITY". | ||
| 150 | +HINT: Use OVERRIDING SYSTEM VALUE to override, Or turn on "identity_insert". | ||
| 151 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING SYSTEM VALUE VALUES (33, 'xxx', 'xxx'); -- success; -- 33 | ||
| 152 | +INSERT 0 1 | ||
| 153 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING USER VALUE VALUES (11111, 'xxx', 'xxx'); -- success; -- 1 | ||
| 154 | +INSERT 0 1 | ||
| 155 | +openGauss=# set identity_insert = on; | ||
| 156 | +SET | ||
| 157 | +openGauss=# INSERT INTO book VALUES (44, 'xxx', 'xxx'); -- error; | ||
| 158 | +ERROR: INSERT has more expressions than target columns | ||
| 159 | +LINE 1: INSERT INTO book VALUES (44, 'xxx', 'xxx'); | ||
| 160 | + ^ | ||
| 161 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING USER VALUE VALUES (11111, 'xxx', 'xxx'); -- success; -- 2 | ||
| 162 | +INSERT 0 1 | ||
| 163 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING SYSTEM VALUE VALUES (55, 'xxx', 'xxx'); -- success; -- 55 | ||
| 164 | +INSERT 0 1 | ||
| 165 | +openGauss=# set identity_insert = off; | ||
| 166 | +SET | ||
| 167 | +openGauss=# select * from book order by 1, 2; | ||
| 168 | + bookid | bookname | author | ||
| 169 | +--------+----------+-------- | ||
| 170 | + 1 | xxx | xxx | ||
| 171 | + 2 | xxx | xxx | ||
| 172 | + 33 | xxx | xxx | ||
| 173 | + 55 | xxx | xxx | ||
| 174 | +(4 rows) | ||
| 175 | + | ||
| 176 | +``` | ||
| 177 | + | ||
| 114 | ## 相关链接<a name="section156744489391"></a> | 178 | ## 相关链接<a name="section156744489391"></a> |
| 115 | 179 | ||
| 116 | [INSERT](../sql_reference/INSERT.md) | 180 | [INSERT](../sql_reference/INSERT.md) |
| @@ -24,8 +24,9 @@ ON ( condition ) | |||
| 24 | ] | 24 | ] |
| 25 | [ | 25 | [ |
| 26 | WHEN NOT MATCHED THEN | 26 | WHEN NOT MATCHED THEN |
| 27 | - INSERT { DEFAULT VALUES | | 27 | + INSERT [ ( column_name [, ...] ) ] |
| 28 | - [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | 28 | + [ OVERRIDING { SYSTEM | USER } VALUE ] |
| 29 | + { DEFAULT VALUES | VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | ||
| 29 | ]; | 30 | ]; |
| 30 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! | 31 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! |
| 31 | ``` | 32 | ``` |
| @@ -50,9 +51,17 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 50 | 51 | ||
| 51 | - 针对hint,会打印相关NOTICE信息。 | 52 | - 针对hint,会打印相关NOTICE信息。 |
| 52 | 53 | ||
| 54 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 55 | + | ||
| 56 | + 该子句用于插入identity列时的行为控制。 | ||
| 57 | + | ||
| 58 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 59 | + - 当开启`identity_insert`时可以插入用户值(包括default),否则只有使用`OVERRIDING SYSTEM VALUE`才能插入用户值,而insert overriding user value会忽略用户的值采用序列的值。 | ||
| 60 | + | ||
| 53 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> | 61 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> |
| 54 | 62 | ||
| 55 | -``` | 63 | +- merge into语句基础示例 |
| 64 | +```sql | ||
| 56 | -- 创建目标表products和源表newproducts,并插入数据 | 65 | -- 创建目标表products和源表newproducts,并插入数据 |
| 57 | openGauss=# CREATE TABLE products | 66 | openGauss=# CREATE TABLE products |
| 58 | ( | 67 | ( |
| @@ -154,6 +163,55 @@ openGauss=# DROP TABLE products; | |||
| 154 | openGauss=# DROP TABLE newproducts; | 163 | openGauss=# DROP TABLE newproducts; |
| 155 | ``` | 164 | ``` |
| 156 | 165 | ||
| 166 | +- identity_insert 与 OVERRIDING clause 示例 | ||
| 167 | +```sql | ||
| 168 | +openGauss=# create table target_table ( id int identity, name varhcar(50), age int); | ||
| 169 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq_identity" for serial column "target_table.id" | ||
| 170 | +ERROR: type "varhcar" does not exist | ||
| 171 | +LINE 1: create table target_table ( id int identity, name varhcar(50... | ||
| 172 | + ^ | ||
| 173 | +openGauss=# create table target_table ( id int identity, name varchar(50), age int); | ||
| 174 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq_identity" for serial column "target_table.id" | ||
| 175 | +CREATE TABLE | ||
| 176 | +openGauss=# create table source_table (id int, name varchar(50), age int); | ||
| 177 | +CREATE TABLE | ||
| 178 | +openGauss=# insert into source_table values (10, 'zliu', 28), (11, 'sqi', 30); | ||
| 179 | +INSERT 0 2 | ||
| 180 | +openGauss=# set identity_insert = off; | ||
| 181 | +SET | ||
| 182 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 183 | +openGauss-# when not matched then | ||
| 184 | +openGauss-# insert (name, age) values (s.name, s.age); | ||
| 185 | +MERGE 2 | ||
| 186 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 187 | +openGauss-# when not matched then | ||
| 188 | +openGauss-# insert (id, name, age) values (1, 'error', 21); | ||
| 189 | +ERROR: cannot insert a non-DEFAULT value into column "id" | ||
| 190 | +DETAIL: Column "id" is an identity column defined as "IDENTITY". | ||
| 191 | +HINT: Use OVERRIDING SYSTEM VALUE to override, Or turn on "identity_insert" | ||
| 192 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 193 | +openGauss-# when not matched then | ||
| 194 | +openGauss-# insert (id, name, age) OVERRIDING USER VALUE values (1, 'success', 22); -- 3 | ||
| 195 | +MERGE 2 | ||
| 196 | +openGauss=# set identity_insert = on; | ||
| 197 | +SET | ||
| 198 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 199 | +openGauss-# when not matched then | ||
| 200 | +openGauss-# insert (id, name, age) values (s.id + 2, 'success', s.age); | ||
| 201 | +MERGE 2 | ||
| 202 | +openGauss=# select * from target_table order by 1, 2,3; | ||
| 203 | + id | name | age | ||
| 204 | +----+---------+----- | ||
| 205 | + 1 | zliu | 28 | ||
| 206 | + 2 | sqi | 30 | ||
| 207 | + 3 | success | 22 | ||
| 208 | + 4 | success | 22 | ||
| 209 | + 12 | success | 28 | ||
| 210 | + 13 | success | 30 | ||
| 211 | +(6 rows) | ||
| 212 | + | ||
| 213 | +``` | ||
| 214 | + | ||
| 157 | ## 相关链接<a name="section156744489391"></a> | 215 | ## 相关链接<a name="section156744489391"></a> |
| 158 | 216 | ||
| 159 | [MERGE INTO](../sql_reference/merge_into.md) | 217 | [MERGE INTO](../sql_reference/merge_into.md) |
| @@ -30,6 +30,7 @@ | |||
| 30 | INSERT [/*+ plan_hint */] INTO | 30 | INSERT [/*+ plan_hint */] INTO |
| 31 | { table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] | 31 | { table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] |
| 32 | | ( target_query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ) [ AS ] alias [ ( column_name [, ...] ) ] } | 32 | | ( target_query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ) [ AS ] alias [ ( column_name [, ...] ) ] } |
| 33 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 33 | { DEFAULT VALUES | 34 | { DEFAULT VALUES |
| 34 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 35 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] |
| 35 | | query } | 36 | | query } |
| @@ -111,6 +112,12 @@ INSERT [/*+ plan_hint */] INTO | |||
| 111 | 112 | ||
| 112 | 取值范围:已存在的字段名。 | 113 | 取值范围:已存在的字段名。 |
| 113 | 114 | ||
| 115 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 116 | + | ||
| 117 | + 该子句用于插入identity列时的行为控制。 | ||
| 118 | + | ||
| 119 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 120 | + | ||
| 114 | - **expression** | 121 | - **expression** |
| 115 | 122 | ||
| 116 | 赋予对应column的一个有效表达式或值: | 123 | 赋予对应column的一个有效表达式或值: |
| @@ -251,6 +258,8 @@ INSERT [/*+ plan_hint */] INTO | |||
| 251 | 258 | ||
| 252 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> | 259 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> |
| 253 | 260 | ||
| 261 | +- insert语句基础示例 | ||
| 262 | + | ||
| 254 | ```sql | 263 | ```sql |
| 255 | --创建表tpcds.reason_t2。 | 264 | --创建表tpcds.reason_t2。 |
| 256 | openGauss=# CREATE TABLE tpcds.reason_t2 | 265 | openGauss=# CREATE TABLE tpcds.reason_t2 |
| @@ -410,3 +419,26 @@ UPDATE SET email = EXCLUDED.email; | |||
| 410 | INSERT INTO users (id, email, name) | 419 | INSERT INTO users (id, email, name) |
| 411 | VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING; | 420 | VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING; |
| 412 | ``` | 421 | ``` |
| 422 | + | ||
| 423 | +- OVERRIDING 子句示例 | ||
| 424 | +```sql | ||
| 425 | +openGauss=# create table t1 (a int generated always as identity, b int); | ||
| 426 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq" for serial column "t1.a" | ||
| 427 | +CREATE TABLE | ||
| 428 | +openGauss=# insert into t1(a, b) values(1, 1); | ||
| 429 | +ERROR: cannot insert a non-DEFAULT value into column "a" | ||
| 430 | +DETAIL: Column "a" is an identity column defined as "GENERATED ALWAYS". | ||
| 431 | +HINT: Use OVERRIDING SYSTEM VALUE to override. | ||
| 432 | +openGauss=# insert into t1(a, b) OVERRIDING SYSTEM VALUE values(10, 1); | ||
| 433 | +INSERT 0 1 | ||
| 434 | +openGauss=# insert into t1(a, b) OVERRIDING USER VALUE values(10, 1); | ||
| 435 | +INSERT 0 1 | ||
| 436 | +openGauss=# select * from t1 order by a, b; | ||
| 437 | + a | b | ||
| 438 | +----+--- | ||
| 439 | + 1 | 1 | ||
| 440 | + 2 | 1 | ||
| 441 | + 10 | 1 | ||
| 442 | +(3 rows) | ||
| 443 | + | ||
| 444 | +``` | ||
| @@ -16,6 +16,7 @@ | |||
| 16 | ``` | 16 | ``` |
| 17 | [ WITH [ RECURSIVE ] with_query [, ...] ] | 17 | [ WITH [ RECURSIVE ] with_query [, ...] ] |
| 18 | REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] | 18 | REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] |
| 19 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 19 | { DEFAULT VALUES | 20 | { DEFAULT VALUES |
| 20 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 21 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] |
| 21 | | query } | 22 | | query } |
| @@ -80,6 +81,12 @@ NULL。 | |||
| 80 | 81 | ||
| 81 | 取值范围:已存在的字段名。 | 82 | 取值范围:已存在的字段名。 |
| 82 | 83 | ||
| 84 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 85 | + | ||
| 86 | + 该子句用于插入identity列时的行为控制。 | ||
| 87 | + | ||
| 88 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 89 | + | ||
| 83 | - **expression** | 90 | - **expression** |
| 84 | 91 | ||
| 85 | 赋予对应column的一个有效表达式或值。 | 92 | 赋予对应column的一个有效表达式或值。 |
| @@ -118,7 +125,8 @@ NULL。 | |||
| 118 | 125 | ||
| 119 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> | 126 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> |
| 120 | 127 | ||
| 121 | -``` | 128 | +- replace into语句基础示例 |
| 129 | +```sql | ||
| 122 | -- 创建表test. | 130 | -- 创建表test. |
| 123 | openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT); | 131 | openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT); |
| 124 | 132 | ||
| @@ -151,4 +159,20 @@ openGauss=# select * from test; | |||
| 151 | 1 | 5 | 159 | 1 | 5 |
| 152 | 2 | 6 | 160 | 2 | 6 |
| 153 | (4 rows) | 161 | (4 rows) |
| 162 | +``` | ||
| 154 | 163 | ||
| 164 | +- OVERRIDING clause示例 | ||
| 165 | +```sql | ||
| 166 | +openGauss=# CREATE TABLE test_t1 (a int GENERATED ALWAYS AS IDENTITY, b text, c int); | ||
| 167 | +NOTICE: CREATE TABLE will create implicit sequence "test_t1_a_seq" for serial column "test_t1.a" | ||
| 168 | +CREATE TABLE | ||
| 169 | +openGauss=# REPLACE INTO test_t1 (a, b, c) VALUES (1, 'alice', 25); -- error | ||
| 170 | +ERROR: cannot insert a non-DEFAULT value into column "a" | ||
| 171 | +DETAIL: Column "a" is an identity column defined as "GENERATED ALWAYS". | ||
| 172 | +HINT: Use OVERRIDING SYSTEM VALUE to override. | ||
| 173 | +openGauss=# -- error REPLACE can not work on sequence! | ||
| 174 | +openGauss=# REPLACE INTO test_t1 (a, b, c) OVERRIDING SYSTEM VALUE VALUES (1, 'alice', 25); | ||
| 175 | +ERROR: REPLACE can not work on sequence! | ||
| 176 | +openGauss=# | ||
| 177 | + | ||
| 178 | +``` | ||
| @@ -221,6 +221,9 @@ | |||
| 221 | | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) | 221 | | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) |
| 222 | | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) | 222 | | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) |
| 223 | | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } | 223 | | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } |
| 224 | + | ALTER [ COLUMN ] column_name ADD GENERATED generated_when AS IDENTITY [ ( seq_options) ] | ||
| 225 | + | ALTER [ COLUMN ] column_name alter_identity_column_options [ ... ] | ||
| 226 | + | ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ] | ||
| 224 | ``` | 227 | ``` |
| 225 | 228 | ||
| 226 | [!NOTE]说明 | 229 | [!NOTE]说明 |
| @@ -266,6 +269,8 @@ | |||
| 266 | > | 269 | > |
| 267 | > 此子句与上一子句中“MODIFY column\_name data\_type”部分语法相同,语义功能不同,当GUC参数b\_format\_behavior\_compat\_options含有'enable\_modify\_column'选项时,将按照此子句功能处理。 | 270 | > 此子句与上一子句中“MODIFY column\_name data\_type”部分语法相同,语义功能不同,当GUC参数b\_format\_behavior\_compat\_options含有'enable\_modify\_column'选项时,将按照此子句功能处理。 |
| 268 | > | 271 | > |
| 272 | + > 不支持列的identity属性添加/修改和删除。 | ||
| 273 | + > | ||
| 269 | >- **CHANGE \[ COLUMN \] old\_column\_name new\_column\_name data\_type \[ CHARACTER SET | CHARSET charset \] \[\{\[ COLLATE collation \] | \[ column\_constraint \]\} \[ ... \] \] \[FIRST | AFTER column\_name\]** | 274 | >- **CHANGE \[ COLUMN \] old\_column\_name new\_column\_name data\_type \[ CHARACTER SET | CHARSET charset \] \[\{\[ COLLATE collation \] | \[ column\_constraint \]\} \[ ... \] \] \[FIRST | AFTER column\_name\]** |
| 270 | > | 275 | > |
| 271 | > 修改表已存在字段的名称和定义,字段新名称不能是已有字段的名称,将用新名称和定义替换字段原名称和定义原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束)等不会被删除。\[FIRST | AFTER column\_name\]语法表示修改字段名称和定义的同时修改字段在表中的位置。 | 276 | > 修改表已存在字段的名称和定义,字段新名称不能是已有字段的名称,将用新名称和定义替换字段原名称和定义原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束)等不会被删除。\[FIRST | AFTER column\_name\]语法表示修改字段名称和定义的同时修改字段在表中的位置。 |
| @@ -280,6 +285,8 @@ | |||
| 280 | > | 285 | > |
| 281 | > 修改字段的字符集或字符序会将字段中的数据转换为新的字符集进行编码。 | 286 | > 修改字段的字符集或字符序会将字段中的数据转换为新的字符集进行编码。 |
| 282 | > | 287 | > |
| 288 | + > 不支持列的identity属性添加/修改和删除。 | ||
| 289 | + > | ||
| 283 | >- **DROP \[ COLUMN \] \[ IF EXISTS \] column\_name \[ RESTRICT | CASCADE \]** | 290 | >- **DROP \[ COLUMN \] \[ IF EXISTS \] column\_name \[ RESTRICT | CASCADE \]** |
| 284 | > | 291 | > |
| 285 | > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 | 292 | > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 |
| @@ -324,25 +331,40 @@ | |||
| 324 | >- **ALTER \[ COLUMN \] column\_name SET STORAGE \{ PLAIN | EXTERNAL | EXTENDED | MAIN \}** | 331 | >- **ALTER \[ COLUMN \] column\_name SET STORAGE \{ PLAIN | EXTERNAL | EXTENDED | MAIN \}** |
| 325 | > | 332 | > |
| 326 | > 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 | 333 | > 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 |
| 334 | + > | ||
| 335 | + > - **ALTER \[ COLUMN \] column\_name ADD GENERATED generated\_when AS IDENTITY \[ \( seq_options\) \]** | ||
| 336 | + > | ||
| 337 | + > 添加identity属性,同时可以指定identity列的起始值,步长,最大值,最小值等属性。 | ||
| 338 | + > | ||
| 339 | + > - **ALTER \[ COLUMN \] column_name alter\_identity\_column\_options \[ ... \]** | ||
| 340 | + > | ||
| 341 | + > 修改identity列的属性,序列的起始值,最大值,最小值,步长等。 | ||
| 342 | + > | ||
| 343 | + > - **ALTER \[ COLUMN \] column\_name DROP IDENTITY \[ IF EXISTS \]** | ||
| 344 | + > | ||
| 345 | + > 删除某列的identity属性,如果列没有identity属性则报错,如果声明了`IF EXISTS`语法则会跳过;成功删除后,identity列所拥有的序列也会被删除,但是列的not null约束不变。 | ||
| 346 | + | ||
| 327 | 347 | ||
| 328 | - 其中列约束column\_constraint为: | 348 | - 其中列约束column\_constraint为: |
| 329 | 349 | ||
| 330 | ``` | 350 | ``` |
| 331 | [ CONSTRAINT constraint_name ] | 351 | [ CONSTRAINT constraint_name ] |
| 332 | - { NOT NULL | | 352 | + { NOT NULL | |
| 333 | - NULL | | 353 | + NULL | |
| 334 | - CHECK ( expression ) | | 354 | + CHECK ( expression ) | |
| 335 | - DEFAULT default_expr | | 355 | + DEFAULT default_expr | |
| 336 | - GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 356 | + GENERATED [ ALWAYS | BY DEFAULT ] AS IDENTITY [ ( seq_options ) ] | |
| 337 | - AUTO_INCREMENT | | 357 | + GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 338 | - ON UPDATE update_expr | | 358 | + ON UPDATE update_expr | |
| 339 | - UNIQUE [KEY] index_parameters | | 359 | + { UNIQUE [KEY] index_parameters [ ON filegroup ] | |
| 340 | - PRIMARY KEY index_parameters | | 360 | + PRIMARY KEY index_parameters [ ON filegroup ] |
| 341 | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | 361 | + } [ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] | |
| 342 | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] | 362 | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] |
| 343 | - [ ON DELETE action ] [ ON UPDATE action ] } | 363 | + [ ON DELETE action ] [ ON UPDATE action ] [ ENABLE ] } | |
| 344 | - [ ENABLE [VALIDATE | NOVALIDATE] | DISABLE [VALIDATE | NOVALIDATE] ] | 364 | + { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] Constraint constraint_name } | |
| 345 | - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | 365 | + AUTO_INCREMENT | |
| 366 | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | ||
| 367 | + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | ||
| 346 | [ COMMENT 'text' ] | 368 | [ COMMENT 'text' ] |
| 347 | ``` | 369 | ``` |
| 348 | 370 | ||
| @@ -376,13 +398,40 @@ | |||
| 376 | [ COMMENT 'text' ] | 398 | [ COMMENT 'text' ] |
| 377 | ``` | 399 | ``` |
| 378 | 400 | ||
| 379 | - 其中索引参数index\_parameters为: | 401 | +- 其中索引参数index\_parameters为: |
| 380 | 402 | ||
| 381 | ``` | 403 | ``` |
| 382 | [ WITH ( {storage_parameter = value} [, ... ] ) ] | 404 | [ WITH ( {storage_parameter = value} [, ... ] ) ] |
| 383 | [ USING INDEX TABLESPACE tablespace_name ] | 405 | [ USING INDEX TABLESPACE tablespace_name ] |
| 384 | ``` | 406 | ``` |
| 385 | 407 | ||
| 408 | +- 其中identity属性参数generated\_when为: | ||
| 409 | + | ||
| 410 | + ```EBNF | ||
| 411 | + ALWAYS | BY DEFAULT | ||
| 412 | + ``` | ||
| 413 | + | ||
| 414 | +- 其中identity属性序列参数seq\_options为: | ||
| 415 | + | ||
| 416 | + ```EBNF | ||
| 417 | + seq_option | ||
| 418 | + | OWNED BY name | ||
| 419 | + | RESTART [ WITH ] NumericOnly | ||
| 420 | + ; | ||
| 421 | + | ||
| 422 | + seq_option: | ||
| 423 | + { MAXVALUE | MINVALUE | START WITH | START | INCREMENT [ BY ] | CACHE } NumericOnly | ||
| 424 | + | { NOMAXVALUE | MINVALUE | NO MAXVALUE | NO MINVALUE | NOCYCLE | [ NO ] CYCLE } | ||
| 425 | + ``` | ||
| 426 | + | ||
| 427 | +- 其中修改identity属性参数alter\_identity\_column\_options为: | ||
| 428 | + | ||
| 429 | + ```EBNF | ||
| 430 | + RESTART [ WITH ] NumericOnly | ||
| 431 | + | SET GENERATED generated_when | ||
| 432 | + | SET seq_option | ||
| 433 | + ``` | ||
| 434 | + | ||
| 386 | - 重命名表。对名称的修改不会影响所存储的数据。 | 435 | - 重命名表。对名称的修改不会影响所存储的数据。 |
| 387 | 436 | ||
| 388 | ``` | 437 | ``` |
| @@ -606,6 +655,26 @@ | |||
| 606 | 655 | ||
| 607 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 | 656 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 |
| 608 | 657 | ||
| 658 | +- **GENERATED \[ ALWAYS | BY DEFAULT \] AS IDENTITY \[ \( seq\_options \) \]** | ||
| 659 | + | ||
| 660 | + 该语句创建identity列,用于生成自增/自减的序列。 | ||
| 661 | + | ||
| 662 | + 若在插入时不指定此列的值(或者指定为DEFAULT),则会默认生成。 | ||
| 663 | + | ||
| 664 | + 当列定义为`GANERATED ALWAYS`时,若想插入用户值需要使用`OVERRIDING SYSTEM VALUE`子句,否则会报错,对于UPDATE只能更新为`DEFAULT`; | ||
| 665 | + 当列定义为`GANERATED BY DEFAULT`时,用户提供的值会优先于默认值。 | ||
| 666 | + | ||
| 667 | + `seq_options`可以用于指定序列的选项。 | ||
| 668 | + | ||
| 669 | + >[!NOTE]说明 | ||
| 670 | + > | ||
| 671 | + >- 该列的数据类型仅为整型,NUMERIC类型,该列隐式包含`NOT NULL`约束。 | ||
| 672 | + >- 无法同时定义default,serial,auto_increment,生成列,NULL约束。 | ||
| 673 | + >- 序列生成非事务操作,当列/表约束检查失败,触发器失败时该列已生成的值不会回滚。 | ||
| 674 | + >- 用户自定义的值不会影响该列的下一个值的生成, | ||
| 675 | + >- 可以定义多列,但同一列不能重复定义。 | ||
| 676 | + >- 不支持分区表。 | ||
| 677 | + | ||
| 609 | - **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** | 678 | - **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** |
| 610 | 679 | ||
| 611 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 | 680 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 |
| @@ -770,7 +839,8 @@ | |||
| 770 | 839 | ||
| 771 | 请参考CREATE TABLE的[示例](create_table.md##示例)。 | 840 | 请参考CREATE TABLE的[示例](create_table.md##示例)。 |
| 772 | 841 | ||
| 773 | -``` | 842 | +- add column first/after示例 |
| 843 | +```sql | ||
| 774 | -- 创建B模式数据库。 | 844 | -- 创建B模式数据库。 |
| 775 | openGauss=# create database test_first_after dbcompatibility 'b'; | 845 | openGauss=# create database test_first_after dbcompatibility 'b'; |
| 776 | openGauss=# \c test_first_after | 846 | openGauss=# \c test_first_after |
| @@ -807,6 +877,67 @@ openGauss=# alter table t1 add constraint uniq_a unique (f1) invisible; | |||
| 807 | openGauss=# alter table t1 alter index uniq_a visible; | 877 | openGauss=# alter table t1 alter index uniq_a visible; |
| 808 | ``` | 878 | ``` |
| 809 | 879 | ||
| 880 | +- 添加/修改/删除identity列 | ||
| 881 | +```sql | ||
| 882 | +openGauss=# create table t1 (a int generated always as identity, b int); | ||
| 883 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq" for serial column "t1.a" | ||
| 884 | +CREATE TABLE | ||
| 885 | +openGauss=# \d+ t1 | ||
| 886 | + Table "public.t1" | ||
| 887 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 888 | +--------+---------+---------------------------------------+---------+--------------+------------- | ||
| 889 | + a | integer | not null generated always as identity | plain | | | ||
| 890 | + b | integer | | plain | | | ||
| 891 | +Has OIDs: no | ||
| 892 | +Options: orientation=row, compression=no | ||
| 893 | + | ||
| 894 | +openGauss=# alter table t1 add column c numeric(20, 0) generated by default as identity; | ||
| 895 | +NOTICE: ALTER TABLE will create implicit sequence "t1_c_seq" for serial column "t1.c" | ||
| 896 | +ALTER TABLE | ||
| 897 | +openGauss=# \d+ t1 | ||
| 898 | + Table "public.t1" | ||
| 899 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 900 | +--------+---------------+-------------------------------------------+---------+--------------+------------- | ||
| 901 | + a | integer | not null generated always as identity | plain | | | ||
| 902 | + b | integer | | plain | | | ||
| 903 | + c | numeric(20,0) | not null generated by default as identity | main | | | ||
| 904 | +Has OIDs: no | ||
| 905 | +Options: orientation=row, compression=no | ||
| 906 | + | ||
| 907 | +openGauss=# alter table t1 alter column c set generated always set start with 10; | ||
| 908 | +ALTER TABLE | ||
| 909 | +openGauss=# \d+ t1 | ||
| 910 | + Table "public.t1" | ||
| 911 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 912 | +--------+---------------+---------------------------------------+---------+--------------+------------- | ||
| 913 | + a | integer | not null generated always as identity | plain | | | ||
| 914 | + b | integer | | plain | | | ||
| 915 | + c | numeric(20,0) | not null generated always as identity | main | | | ||
| 916 | +Has OIDs: no | ||
| 917 | +Options: orientation=row, compression=no | ||
| 918 | + | ||
| 919 | +openGauss=# alter table t1 alter column b drop identity; | ||
| 920 | +ERROR: column "b" of relation "t1" is not an identity column | ||
| 921 | +openGauss=# alter table t1 alter column b drop identity if exists; | ||
| 922 | +NOTICE: column "b" of relation "t1" is not an identity column, skipping | ||
| 923 | +ALTER TABLE | ||
| 924 | +openGauss=# alter table t1 alter column c drop identity; | ||
| 925 | +ALTER TABLE | ||
| 926 | +openGauss=# alter table t1 alter column c add generated by default as identity(start with 10 increment 20); | ||
| 927 | +NOTICE: ALTER TABLE will create implicit sequence "t1_c_seq1" for serial column "t1.c" | ||
| 928 | +ALTER TABLE | ||
| 929 | +openGauss=# \d+ t1 | ||
| 930 | + Table "public.t1" | ||
| 931 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 932 | +--------+---------------+-------------------------------------------+---------+--------------+------------- | ||
| 933 | + a | integer | not null generated always as identity | plain | | | ||
| 934 | + b | integer | | plain | | | ||
| 935 | + c | numeric(20,0) | not null generated by default as identity | main | | | ||
| 936 | +Has OIDs: no | ||
| 937 | +Options: orientation=row, compression=no | ||
| 938 | + | ||
| 939 | +``` | ||
| 940 | + | ||
| 810 | ## 相关链接 | 941 | ## 相关链接 |
| 811 | 942 | ||
| 812 | <a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s489a6430be6447c193a4011257dc4994"></a> | 943 | <a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s489a6430be6447c193a4011257dc4994"></a> |
| @@ -22,8 +22,9 @@ ON ( condition ) | |||
| 22 | ] | 22 | ] |
| 23 | [ | 23 | [ |
| 24 | WHEN NOT MATCHED THEN | 24 | WHEN NOT MATCHED THEN |
| 25 | - INSERT { DEFAULT VALUES | | 25 | + INSERT [ ( column_name [, ...] ) ] |
| 26 | - [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | 26 | + [ OVERRIDING { SYSTEM | USER } VALUE ] |
| 27 | + { DEFAULT VALUES | VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | ||
| 27 | ]; | 28 | ]; |
| 28 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! | 29 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! |
| 29 | ``` | 30 | ``` |
| @@ -83,6 +84,12 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 83 | 84 | ||
| 84 | WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 | 85 | WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 |
| 85 | 86 | ||
| 87 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 88 | + | ||
| 89 | + 该子句用于插入identity列时的行为控制。 | ||
| 90 | + | ||
| 91 | + `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 92 | + | ||
| 86 | - **DEFAULT** | 93 | - **DEFAULT** |
| 87 | 94 | ||
| 88 | 用对应字段的缺省值填充该字段。 | 95 | 用对应字段的缺省值填充该字段。 |
| @@ -95,7 +102,8 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 95 | 102 | ||
| 96 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> | 103 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> |
| 97 | 104 | ||
| 98 | -``` | 105 | +- merge into语句基础示例 |
| 106 | +```sql | ||
| 99 | -- 创建目标表products和源表newproducts,并插入数据 | 107 | -- 创建目标表products和源表newproducts,并插入数据 |
| 100 | openGauss=# CREATE TABLE products | 108 | openGauss=# CREATE TABLE products |
| 101 | ( | 109 | ( |
| @@ -148,3 +156,58 @@ openGauss=# SELECT * FROM products ORDER BY product_id; | |||
| 148 | openGauss=# DROP TABLE products; | 156 | openGauss=# DROP TABLE products; |
| 149 | openGauss=# DROP TABLE newproducts; | 157 | openGauss=# DROP TABLE newproducts; |
| 150 | ``` | 158 | ``` |
| 159 | + | ||
| 160 | +- merge into when not matched then insert overriding clause示例 | ||
| 161 | +```sql | ||
| 162 | +openGauss=# create table target_table ( | ||
| 163 | +openGauss(# id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, | ||
| 164 | +openGauss(# name varchar(50), | ||
| 165 | +openGauss(# age int | ||
| 166 | +openGauss(# ); | ||
| 167 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq" for serial column "target_table.id" | ||
| 168 | +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "target_table_pkey" for table "target_table" | ||
| 169 | +CREATE TABLE | ||
| 170 | +openGauss=# create table source_table (id int, name varchar(50), age int); | ||
| 171 | +CREATE TABLE | ||
| 172 | +openGauss=# insert into source_table values (10, 'zliu', 28), (11, 'sqi', 30); | ||
| 173 | +INSERT 0 2 | ||
| 174 | +openGauss=# -- expected: success. let id generated by system. | ||
| 175 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 176 | +openGauss-# when not matched then | ||
| 177 | +openGauss-# insert (name, age) values (s.name, s.age); | ||
| 178 | +MERGE 2 | ||
| 179 | +openGauss=# -- expected: error | ||
| 180 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 181 | +openGauss-# when not matched then | ||
| 182 | +openGauss-# insert (id, name, age) values (1, 'error', 21); | ||
| 183 | +ERROR: cannot insert a non-DEFAULT value into column "id" | ||
| 184 | +DETAIL: Column "id" is an identity column defined as "GENERATED ALWAYS". | ||
| 185 | +HINT: Use OVERRIDING SYSTEM VALUE to override | ||
| 186 | +openGauss=# -- expected: success | ||
| 187 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 188 | +openGauss-# when not matched then | ||
| 189 | +openGauss-# insert (id, name, age) OVERRIDING USER VALUE values (1, 'success', 22); -- 3 | ||
| 190 | +MERGE 2 | ||
| 191 | +openGauss=# -- expected: error | ||
| 192 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 193 | +openGauss-# when not matched then | ||
| 194 | +openGauss-# insert (id, name, age) OVERRIDING SYSTEM VALUE values (2, 'error', 23); | ||
| 195 | +ERROR: duplicate key value violates unique constraint "target_table_pkey" | ||
| 196 | +DETAIL: Key (id)=(2) already exists. | ||
| 197 | +openGauss=# -- expected: error | ||
| 198 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 199 | +openGauss-# when not matched then | ||
| 200 | +openGauss-# insert (id, name, age) OVERRIDING SYSTEM VALUE values (3, 'error', 24); | ||
| 201 | +ERROR: duplicate key value violates unique constraint "target_table_pkey" | ||
| 202 | +DETAIL: Key (id)=(3) already exists. | ||
| 203 | +openGauss=# select * from target_table order by 1,2,3; | ||
| 204 | + id | name | age | ||
| 205 | +----+---------+----- | ||
| 206 | + 1 | zliu | 28 | ||
| 207 | + 2 | sqi | 30 | ||
| 208 | + 3 | success | 22 | ||
| 209 | + 4 | success | 22 | ||
| 210 | +(4 rows) | ||
| 211 | + | ||
| 212 | +``` | ||
| 213 | + | ||
| @@ -190,5 +190,19 @@ PG\_ATTRIBUTE系统表存储关于表字段的信息。 | |||
| 190 | <p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a>3. ATT_KV_TIMETAG:时间列。</p> | 190 | <p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p173371358124510"></a>3. ATT_KV_TIMETAG:时间列。</p> |
| 191 | </td> | 191 | </td> |
| 192 | </tr> | 192 | </tr> |
| 193 | +<tr id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_row1718431494418"><td class="cellrowborder" valign="top" width="14.499999999999998%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a>attdroppedname</p> | ||
| 194 | +</td> | ||
| 195 | +<td class="cellrowborder" valign="top" width="17.919999999999998%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a>name</p> | ||
| 196 | +</td> | ||
| 197 | +<td class="cellrowborder" valign="top" width="67.58%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a>被删除前的字段名</p> | ||
| 198 | +</td> | ||
| 199 | +</tr> | ||
| 200 | +<tr id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_row1718431494418"><td class="cellrowborder" valign="top" width="14.499999999999998%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p51842014164410"></a>attidentity</p> | ||
| 201 | +</td> | ||
| 202 | +<td class="cellrowborder" valign="top" width="17.919999999999998%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p6184101464413"></a>char</p> | ||
| 203 | +</td> | ||
| 204 | +<td class="cellrowborder" valign="top" width="67.58%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a><a name="zh-cn_topic_0283137510_zh-cn_topic_0237122272_p11841145443"></a>某一列的identity属性, 取值为'a','d'或者'm'</p> | ||
| 205 | +</td> | ||
| 206 | +</tr> | ||
| 193 | </tbody> | 207 | </tbody> |
| 194 | </table> | 208 | </table> |
| @@ -30,6 +30,7 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 30 | 30 | ||
| 31 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 | 31 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 |
| 32 | - filegroup为任意字符串,支持通过[]包裹。 | 32 | - filegroup为任意字符串,支持通过[]包裹。 |
| 33 | +- 新增支持为列添加identity属性的语法。 | ||
| 33 | 34 | ||
| 34 | ## 语法格式<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s58bdce220c9f4292ba9af919b04ad25c"></a> | 35 | ## 语法格式<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s58bdce220c9f4292ba9af919b04ad25c"></a> |
| 35 | 36 | ||
| @@ -89,21 +90,23 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 89 | 90 | ||
| 90 | ``` | 91 | ``` |
| 91 | [ CONSTRAINT constraint_name ] | 92 | [ CONSTRAINT constraint_name ] |
| 92 | - { NOT NULL | | 93 | + { NOT NULL | |
| 93 | - NULL | | 94 | + NULL | |
| 94 | - CHECK ( expression ) | | 95 | + CHECK ( expression ) | |
| 95 | - DEFAULT default_expr | | 96 | + DEFAULT default_expr | |
| 96 | - GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 97 | + IDENTITY [ ( seed, increment ) ] | |
| 97 | - AUTO_INCREMENT | | 98 | + GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 98 | - ON UPDATE update_expr | | 99 | + ON UPDATE update_expr | |
| 99 | - UNIQUE [KEY] index_parameters [ ON filegroup ] | | 100 | + { UNIQUE [KEY] index_parameters [ ON filegroup ] | |
| 100 | - PRIMARY KEY index_parameters [ ON filegroup ] | | 101 | + PRIMARY KEY index_parameters [ ON filegroup ] |
| 101 | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | 102 | + } [ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] | |
| 102 | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] | 103 | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] |
| 103 | - [ ON DELETE action ] [ ON UPDATE action ] } | 104 | + [ ON DELETE action ] [ ON UPDATE action ] [ ENABLE ] | |
| 104 | - [ ENABLE [VALIDATE | NOVALIDATE] | DISABLE [VALIDATE | NOVALIDATE] ] | 105 | + { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] Constraint constraint_name | |
| 105 | - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | 106 | + DEFAULT (expression) FOR (column_name) } | |
| 106 | - DEFAULT (expression) FOR (column_name) | 107 | + AUTO_INCREMENT | |
| 108 | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | ||
| 109 | + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | ||
| 107 | [ COMMENT 'text' ] | 110 | [ COMMENT 'text' ] |
| 108 | ``` | 111 | ``` |
| 109 | 112 | ||
| @@ -211,12 +214,17 @@ COMPRESSION_DELAY选项的取值delay为[0, 10080]的整数; | |||
| 211 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 | 214 | - 修改表语句中,针对UNIQUE和PRIMARY KEY约束,支持ON {filegroup | "default" } 选项,无实际作用,仅语法支持。 |
| 212 | - filegroup为任意字符串,支持通过[]包裹。 | 215 | - filegroup为任意字符串,支持通过[]包裹。 |
| 213 | 216 | ||
| 214 | -- **DEFAULT (expression) FOR (column_name)** | 217 | +- **DEFAULT \( expression \) FOR \( column_name \)** |
| 215 | 218 | ||
| 216 | - 该语法可以为指定列添加DEFAULT约束,该约束为一个表达式。 | 219 | - 该语法可以为指定列添加DEFAULT约束,该约束为一个表达式。 |
| 217 | - 对于显式声明约束名的场景,仅做语法支持,使用该语法创建的DEFAULT约束无法通过约束名进行删除。 | 220 | - 对于显式声明约束名的场景,仅做语法支持,使用该语法创建的DEFAULT约束无法通过约束名进行删除。 |
| 218 | 221 | ||
| 219 | -## opt\_clustered示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 222 | +- **IDENTITY \[ ( seed, increment ) \]** |
| 223 | + | ||
| 224 | + - 该语法为列添加identity属性,序列值递增,`seed`指定起始值,`increment`指定步长。 | ||
| 225 | + - 一张表只能定义一列(包括generated as identity)。 | ||
| 226 | + | ||
| 227 | +## opt\_clustered示例 | ||
| 220 | 228 | ||
| 221 | ``` | 229 | ``` |
| 222 | openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT); | 230 | openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT); |
| @@ -224,9 +232,9 @@ openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_a UNIQUE | |||
| 224 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a); | 232 | openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a); |
| 225 | ``` | 233 | ``` |
| 226 | 234 | ||
| 227 | -## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 235 | +## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 |
| 228 | 236 | ||
| 229 | -``` | 237 | +```sql |
| 230 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); | 238 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); |
| 231 | NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1" | 239 | NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1" |
| 232 | 240 | ||
| @@ -251,9 +259,9 @@ NOTICE: parameter "data_compression" is currently ignored. | |||
| 251 | NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3" | 259 | NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3" |
| 252 | ``` | 260 | ``` |
| 253 | 261 | ||
| 254 | -## filegroup示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 262 | +## filegroup示例 |
| 255 | 263 | ||
| 256 | -``` | 264 | +```sql |
| 257 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); | 265 | create table test1(col1 int primary key with(fillfactor = 20), col2 int); |
| 258 | 266 | ||
| 259 | alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1]; | 267 | alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1]; |
| @@ -268,10 +276,44 @@ create table test3(col1 int, col2 int); | |||
| 268 | 276 | ||
| 269 | alter table test3 add column col3 int primary key with (data_compression = none) on [primar4]; | 277 | alter table test3 add column col3 int primary key with (data_compression = none) on [primar4]; |
| 270 | ``` | 278 | ``` |
| 279 | +## IDENTITY \[ \( seed, increment \) \] 示例 | ||
| 280 | +```sql | ||
| 281 | +openGauss=# create extension shark; | ||
| 282 | +CREATE EXTENSION | ||
| 283 | +openGauss=# create table t1 (a int identity(10, 20), b int); | ||
| 284 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq_identity" for serial column "t1.a" | ||
| 285 | +CREATE TABLE | ||
| 286 | +openGauss=# \d+ t1 | ||
| 287 | + Table "public.t1" | ||
| 288 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 289 | +--------+---------+-------------------+---------+--------------+------------- | ||
| 290 | + a | integer | not null identity | plain | | | ||
| 291 | + b | integer | | plain | | | ||
| 292 | +Has OIDs: no | ||
| 293 | +Options: orientation=row, compression=no, collate=1537 | ||
| 294 | +Character Set: UTF8 | ||
| 295 | +Collate: utf8mb4_general_ci | ||
| 271 | 296 | ||
| 272 | -## DEFAULT (expression) FOR (column_name) 示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 297 | +openGauss=# alter table t1 alter column b add identity ; |
| 298 | +NOTICE: ALTER TABLE will create implicit sequence "t1_b_seq_identity" for serial column "t1.b" | ||
| 299 | +ERROR: Multiple identity columns specified for table "t1". Only one identity column per table is allowed. | ||
| 300 | +openGauss=# create table t2 (a int, b int); | ||
| 301 | +CREATE TABLE | ||
| 302 | +openGauss=# alter table t2 alter column b add identity ; | ||
| 303 | +NOTICE: ALTER TABLE will create implicit sequence "t2_b_seq_identity" for serial column "t2.b" | ||
| 304 | +ERROR: column "b" of relation "t2" must be declared NOT NULL before identity can be added | ||
| 305 | +openGauss=# alter table t2 alter column b set not null; | ||
| 306 | +ALTER TABLE | ||
| 307 | +openGauss=# alter table t2 alter column b add identity ; | ||
| 308 | +NOTICE: ALTER TABLE will create implicit sequence "t2_b_seq_identity" for serial column "t2.b" | ||
| 309 | +ALTER TABLE | ||
| 310 | +openGauss=# | ||
| 273 | 311 | ||
| 274 | ``` | 312 | ``` |
| 313 | + | ||
| 314 | +## DEFAULT (expression) FOR (column_name) 示例 | ||
| 315 | + | ||
| 316 | +```sql | ||
| 275 | openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float); | 317 | openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float); |
| 276 | CREATE TABLE | 318 | CREATE TABLE |
| 277 | openGauss=# \d+ ADD_DEFAULT | 319 | openGauss=# \d+ ADD_DEFAULT |
| @@ -64,6 +64,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 64 | NULL | | 64 | NULL | |
| 65 | CHECK ( expression ) | | 65 | CHECK ( expression ) | |
| 66 | DEFAULT default_expr | | 66 | DEFAULT default_expr | |
| 67 | + IDENTITY [ ( seed, increment ) ] | | ||
| 67 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 68 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 68 | AS ( generation_expr ) [PERSISTED] | | 69 | AS ( generation_expr ) [PERSISTED] | |
| 69 | AUTO_INCREMENT | | 70 | AUTO_INCREMENT | |
| @@ -101,6 +102,11 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 101 | 102 | ||
| 102 | ## 参数说明 | 103 | ## 参数说明 |
| 103 | 104 | ||
| 105 | +- **IDENTITY \[ \( seed, increment \) \]** | ||
| 106 | + | ||
| 107 | + - 该语法为列添加identity属性,序列值递增,`seed`指定起始值,`increment`指定步长。 | ||
| 108 | + - 一张表只能定义一列(包括generated as identity)。 | ||
| 109 | + | ||
| 104 | - **AS \( generation\_expr \) \[PERSISTED\]** | 110 | - **AS \( generation\_expr \) \[PERSISTED\]** |
| 105 | 111 | ||
| 106 | 该子句为兼容D库的语法,将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,PERSISTED表示像普通列一样存储生成列的值。 | 112 | 该子句为兼容D库的语法,将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,PERSISTED表示像普通列一样存储生成列的值。 |
| @@ -201,6 +207,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 201 | - table_constraint中,针对PRIMARY KEY和UNIQUE约束支持使用{ column_name [ ASC | DESC ] }语法, 为主键和唯一键提供升序或降序约束。 | 207 | - table_constraint中,针对PRIMARY KEY和UNIQUE约束支持使用{ column_name [ ASC | DESC ] }语法, 为主键和唯一键提供升序或降序约束。 |
| 202 | 208 | ||
| 203 | ## 生成列示例 | 209 | ## 生成列示例 |
| 210 | + | ||
| 204 | ```sql | 211 | ```sql |
| 205 | opengauss=# CREATE TABLE Products( | 212 | opengauss=# CREATE TABLE Products( |
| 206 | opengauss(# QtyAvailable smallint, | 213 | opengauss(# QtyAvailable smallint, |
| @@ -233,6 +240,39 @@ opengauss=# ALTER TABLE Products DROP unitprice; | |||
| 233 | ALTER TABLE | 240 | ALTER TABLE |
| 234 | ``` | 241 | ``` |
| 235 | 242 | ||
| 243 | +## IDENTITY \[ \( seed, increment \) \] 示例 | ||
| 244 | +```sql | ||
| 245 | +openGauss=# create extension shark; | ||
| 246 | +CREATE EXTENSION | ||
| 247 | +openGauss=# create table t1 (a int identity(10, 20), b int); | ||
| 248 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq_identity" for serial column "t1.a" | ||
| 249 | +CREATE TABLE | ||
| 250 | +openGauss=# \d+ t1 | ||
| 251 | + Table "public.t1" | ||
| 252 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 253 | +--------+---------+-------------------+---------+--------------+------------- | ||
| 254 | + a | integer | not null identity | plain | | | ||
| 255 | + b | integer | | plain | | | ||
| 256 | +Has OIDs: no | ||
| 257 | +Options: orientation=row, compression=no, collate=1537 | ||
| 258 | +Character Set: UTF8 | ||
| 259 | +Collate: utf8mb4_general_ci | ||
| 260 | + | ||
| 261 | +openGauss=# insert into t1(b) values(10); | ||
| 262 | +INSERT 0 1 | ||
| 263 | +openGauss=# insert into t1(a, b) overriding system value values(12, 10); | ||
| 264 | +INSERT 0 1 | ||
| 265 | +openGauss=# insert into t1 default values; | ||
| 266 | +INSERT 0 1 | ||
| 267 | +openGauss=# select * from t1; | ||
| 268 | + a | b | ||
| 269 | +----+---- | ||
| 270 | + 10 | 10 | ||
| 271 | + 12 | 10 | ||
| 272 | + 30 | | ||
| 273 | +(3 rows) | ||
| 274 | + | ||
| 275 | +``` | ||
| 236 | ## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 | 276 | ## WITH \( \{ storage\_parameter = value \} \[, ... \] \)示例 |
| 237 | 277 | ||
| 238 | ```sql | 278 | ```sql |
| @@ -315,7 +355,7 @@ Options: orientation=row, compression=no | |||
| 315 | 355 | ||
| 316 | ``` | 356 | ``` |
| 317 | 357 | ||
| 318 | -## 使用特殊前缀创建本地和全局临时表<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 358 | +## 使用特殊前缀创建本地和全局临时表 |
| 319 | 359 | ||
| 320 | ```sql | 360 | ```sql |
| 321 | openGauss=# CREATE TEMPORARY TABLE #ltt1 | 361 | openGauss=# CREATE TEMPORARY TABLE #ltt1 |
| @@ -325,7 +365,7 @@ openGauss=# CREATE TEMPORARY TABLE #ltt1 | |||
| 325 | ADDRESS VARCHAR(50) , | 365 | ADDRESS VARCHAR(50) , |
| 326 | POSTCODE CHAR(6) | 366 | POSTCODE CHAR(6) |
| 327 | ) ON COMMIT PRESERVE ROWS; | 367 | ) ON COMMIT PRESERVE ROWS; |
| 328 | - | 368 | +CREATE TABLE |
| 329 | openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 | 369 | openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 |
| 330 | ( | 370 | ( |
| 331 | ID INTEGER NOT NULL, | 371 | ID INTEGER NOT NULL, |
| @@ -333,7 +373,7 @@ openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1 | |||
| 333 | ADDRESS VARCHAR(50) , | 373 | ADDRESS VARCHAR(50) , |
| 334 | POSTCODE CHAR(6) | 374 | POSTCODE CHAR(6) |
| 335 | ) ON COMMIT PRESERVE ROWS; | 375 | ) ON COMMIT PRESERVE ROWS; |
| 336 | - | 376 | +CREATE TABLE |
| 337 | ``` | 377 | ``` |
| 338 | 378 | ||
| 339 | ## 相关链接<a name="section156744489391"></a> | 379 | ## 相关链接<a name="section156744489391"></a> |
| @@ -14,6 +14,7 @@ | |||
| 14 | ``` | 14 | ``` |
| 15 | [ WITH [ RECURSIVE ] with_query [, ...] ] | 15 | [ WITH [ RECURSIVE ] with_query [, ...] ] |
| 16 | INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ] | 16 | INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ] |
| 17 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 17 | { DEFAULT VALUES | 18 | { DEFAULT VALUES |
| 18 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 19 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] |
| 19 | | query } | 20 | | query } |
| @@ -45,9 +46,16 @@ INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [tab | |||
| 45 | 46 | ||
| 46 | - 针对hint,会打印相关NOTICE信息。 | 47 | - 针对hint,会打印相关NOTICE信息。 |
| 47 | 48 | ||
| 48 | -## table_hint子句示例<a name="zh-cn_topic_0283136578_zh-cn_topic_0237122106_zh-cn_topic_0059777455_s985289833081489e9d77c485755bd362"></a> | 49 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** |
| 49 | 50 | ||
| 50 | -``` | 51 | + 该子句用于插入identity列时的行为控制。 |
| 52 | + | ||
| 53 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 54 | + - 当开启`identity_insert`时可以插入用户值(包括default),否则只有使用`OVERRIDING SYSTEM VALUE`才能插入用户值,而insert overriding user value会忽略用户的值采用序列的值。 | ||
| 55 | + | ||
| 56 | +## table_hint子句示例 | ||
| 57 | + | ||
| 58 | +```sql | ||
| 51 | create table t1(c1 int, c2 int); | 59 | create table t1(c1 int, c2 int); |
| 52 | 60 | ||
| 53 | insert into t1 values(1, 2); | 61 | insert into t1 values(1, 2); |
| @@ -111,6 +119,62 @@ NOTICE: The nolock option is currently ignored | |||
| 111 | NOTICE: The nowait option is currently ignored | 119 | NOTICE: The nowait option is currently ignored |
| 112 | ``` | 120 | ``` |
| 113 | 121 | ||
| 122 | +## identity_insert 与 OVERRIDING clause 示例 | ||
| 123 | +```sql | ||
| 124 | +openGauss=# create extension shark; | ||
| 125 | +CREATE EXTENSION | ||
| 126 | +openGauss=# CREATE TABLE book(bookId int IDENTITY, bookname NVARCHAR(50), author NVARCHAR(50)); | ||
| 127 | +NOTICE: CREATE TABLE will create implicit sequence "book_bookid_seq_identity" for serial column "book.bookid" | ||
| 128 | +CREATE TABLE | ||
| 129 | +openGauss=# \d+ book | ||
| 130 | + Table "public.book" | ||
| 131 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 132 | +----------+---------------+-----------------------------------------------+----------+--------------+------------- | ||
| 133 | + bookid | integer | not null identity | plain | | | ||
| 134 | + bookname | nvarchar2(50) | character set UTF8 collate utf8mb4_general_ci | extended | | | ||
| 135 | + author | nvarchar2(50) | character set UTF8 collate utf8mb4_general_ci | extended | | | ||
| 136 | +Has OIDs: no | ||
| 137 | +Options: orientation=row, compression=no, collate=1537 | ||
| 138 | +Character Set: UTF8 | ||
| 139 | +Collate: utf8mb4_general_ci | ||
| 140 | + | ||
| 141 | +openGauss=# set identity_insert = off; | ||
| 142 | +SET | ||
| 143 | +openGauss=# INSERT INTO book VALUES (2, 'xxx', 'xxx'); -- error; | ||
| 144 | +ERROR: INSERT has more expressions than target columns | ||
| 145 | +LINE 1: INSERT INTO book VALUES (2, 'xxx', 'xxx'); | ||
| 146 | + ^ | ||
| 147 | +openGauss=# INSERT INTO book (bookid, bookname, author) VALUES(11111, 'xxxx', 'xxx'); -- error, turn on identity_insert or use OVERRIDING | ||
| 148 | +ERROR: cannot insert a non-DEFAULT value into column "bookid" | ||
| 149 | +DETAIL: Column "bookid" is an identity column defined as "IDENTITY". | ||
| 150 | +HINT: Use OVERRIDING SYSTEM VALUE to override, Or turn on "identity_insert". | ||
| 151 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING SYSTEM VALUE VALUES (33, 'xxx', 'xxx'); -- success; -- 33 | ||
| 152 | +INSERT 0 1 | ||
| 153 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING USER VALUE VALUES (11111, 'xxx', 'xxx'); -- success; -- 1 | ||
| 154 | +INSERT 0 1 | ||
| 155 | +openGauss=# set identity_insert = on; | ||
| 156 | +SET | ||
| 157 | +openGauss=# INSERT INTO book VALUES (44, 'xxx', 'xxx'); -- error; | ||
| 158 | +ERROR: INSERT has more expressions than target columns | ||
| 159 | +LINE 1: INSERT INTO book VALUES (44, 'xxx', 'xxx'); | ||
| 160 | + ^ | ||
| 161 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING USER VALUE VALUES (11111, 'xxx', 'xxx'); -- success; -- 2 | ||
| 162 | +INSERT 0 1 | ||
| 163 | +openGauss=# INSERT INTO book (bookid, bookname, author) OVERRIDING SYSTEM VALUE VALUES (55, 'xxx', 'xxx'); -- success; -- 55 | ||
| 164 | +INSERT 0 1 | ||
| 165 | +openGauss=# set identity_insert = off; | ||
| 166 | +SET | ||
| 167 | +openGauss=# select * from book order by 1, 2; | ||
| 168 | + bookid | bookname | author | ||
| 169 | +--------+----------+-------- | ||
| 170 | + 1 | xxx | xxx | ||
| 171 | + 2 | xxx | xxx | ||
| 172 | + 33 | xxx | xxx | ||
| 173 | + 55 | xxx | xxx | ||
| 174 | +(4 rows) | ||
| 175 | + | ||
| 176 | +``` | ||
| 177 | + | ||
| 114 | ## 相关链接<a name="section156744489391"></a> | 178 | ## 相关链接<a name="section156744489391"></a> |
| 115 | 179 | ||
| 116 | [INSERT](../sql_reference/insert.md) | 180 | [INSERT](../sql_reference/insert.md) |
| @@ -24,8 +24,9 @@ ON ( condition ) | |||
| 24 | ] | 24 | ] |
| 25 | [ | 25 | [ |
| 26 | WHEN NOT MATCHED THEN | 26 | WHEN NOT MATCHED THEN |
| 27 | - INSERT { DEFAULT VALUES | | 27 | + INSERT [ ( column_name [, ...] ) ] |
| 28 | - [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | 28 | + [ OVERRIDING { SYSTEM | USER } VALUE ] |
| 29 | + { DEFAULT VALUES | VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | ||
| 29 | ]; | 30 | ]; |
| 30 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! | 31 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! |
| 31 | ``` | 32 | ``` |
| @@ -50,9 +51,18 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 50 | 51 | ||
| 51 | - 针对hint,会打印相关NOTICE信息。 | 52 | - 针对hint,会打印相关NOTICE信息。 |
| 52 | 53 | ||
| 54 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 55 | + | ||
| 56 | + 该子句用于插入identity列时的行为控制。 | ||
| 57 | + | ||
| 58 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 59 | + - 当开启`identity_insert`时可以插入用户值(包括default),否则只有使用`OVERRIDING SYSTEM VALUE`才能插入用户值,而insert overriding user value会忽略用户的值采用序列的值。 | ||
| 60 | + | ||
| 61 | + | ||
| 53 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> | 62 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> |
| 54 | 63 | ||
| 55 | -``` | 64 | +- merge into语句基础示例 |
| 65 | +```sql | ||
| 56 | -- 创建目标表products和源表newproducts,并插入数据 | 66 | -- 创建目标表products和源表newproducts,并插入数据 |
| 57 | openGauss=# CREATE TABLE products | 67 | openGauss=# CREATE TABLE products |
| 58 | ( | 68 | ( |
| @@ -154,6 +164,55 @@ openGauss=# DROP TABLE products; | |||
| 154 | openGauss=# DROP TABLE newproducts; | 164 | openGauss=# DROP TABLE newproducts; |
| 155 | ``` | 165 | ``` |
| 156 | 166 | ||
| 167 | +- identity_insert 与 OVERRIDING clause 示例 | ||
| 168 | +```sql | ||
| 169 | +openGauss=# create table target_table ( id int identity, name varhcar(50), age int); | ||
| 170 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq_identity" for serial column "target_table.id" | ||
| 171 | +ERROR: type "varhcar" does not exist | ||
| 172 | +LINE 1: create table target_table ( id int identity, name varhcar(50... | ||
| 173 | + ^ | ||
| 174 | +openGauss=# create table target_table ( id int identity, name varchar(50), age int); | ||
| 175 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq_identity" for serial column "target_table.id" | ||
| 176 | +CREATE TABLE | ||
| 177 | +openGauss=# create table source_table (id int, name varchar(50), age int); | ||
| 178 | +CREATE TABLE | ||
| 179 | +openGauss=# insert into source_table values (10, 'zliu', 28), (11, 'sqi', 30); | ||
| 180 | +INSERT 0 2 | ||
| 181 | +openGauss=# set identity_insert = off; | ||
| 182 | +SET | ||
| 183 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 184 | +openGauss-# when not matched then | ||
| 185 | +openGauss-# insert (name, age) values (s.name, s.age); | ||
| 186 | +MERGE 2 | ||
| 187 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 188 | +openGauss-# when not matched then | ||
| 189 | +openGauss-# insert (id, name, age) values (1, 'error', 21); | ||
| 190 | +ERROR: cannot insert a non-DEFAULT value into column "id" | ||
| 191 | +DETAIL: Column "id" is an identity column defined as "IDENTITY". | ||
| 192 | +HINT: Use OVERRIDING SYSTEM VALUE to override, Or turn on "identity_insert" | ||
| 193 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 194 | +openGauss-# when not matched then | ||
| 195 | +openGauss-# insert (id, name, age) OVERRIDING USER VALUE values (1, 'success', 22); -- 3 | ||
| 196 | +MERGE 2 | ||
| 197 | +openGauss=# set identity_insert = on; | ||
| 198 | +SET | ||
| 199 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 200 | +openGauss-# when not matched then | ||
| 201 | +openGauss-# insert (id, name, age) values (s.id + 2, 'success', s.age); | ||
| 202 | +MERGE 2 | ||
| 203 | +openGauss=# select * from target_table order by 1, 2,3; | ||
| 204 | + id | name | age | ||
| 205 | +----+---------+----- | ||
| 206 | + 1 | zliu | 28 | ||
| 207 | + 2 | sqi | 30 | ||
| 208 | + 3 | success | 22 | ||
| 209 | + 4 | success | 22 | ||
| 210 | + 12 | success | 28 | ||
| 211 | + 13 | success | 30 | ||
| 212 | +(6 rows) | ||
| 213 | + | ||
| 214 | +``` | ||
| 215 | + | ||
| 157 | ## 相关链接<a name="section156744489391"></a> | 216 | ## 相关链接<a name="section156744489391"></a> |
| 158 | 217 | ||
| 159 | [MERGE INTO](../sql_reference/merge_into.md) | 218 | [MERGE INTO](../sql_reference/merge_into.md) |
| @@ -238,23 +238,26 @@ | |||
| 238 | 其中列相关的操作column\_clause可以是以下子句之一: | 238 | 其中列相关的操作column\_clause可以是以下子句之一: |
| 239 | 239 | ||
| 240 | ``` | 240 | ``` |
| 241 | -ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] [ FIRST | AFTER column_name ] | 241 | +ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [ compress_mode ] [ COLLATE collation ] [column_constraint [ ... ] ] [ FIRST | AFTER column_name ] |
| 242 | | ADD [ IF NOT EXISTS ] column_name data_type [ compress_mode ] [, ...] | 242 | | ADD [ IF NOT EXISTS ] column_name data_type [ compress_mode ] [, ...] |
| 243 | | MODIFY column_name data_type | 243 | | MODIFY column_name data_type |
| 244 | | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | 244 | | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] |
| 245 | | MODIFY column_name [ CONSTRAINT constraint_name ] NULL | 245 | | MODIFY column_name [ CONSTRAINT constraint_name ] NULL |
| 246 | -| MODIFY [ COLUMN ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [{[ COLLATE collation ] | [ column_constraint ]} [ ... ] ] [FIRST | AFTER column_name] | 246 | +| MODIFY [ COLUMN ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [{[ COLLATE collation ] | [ column_constraint ]} [ ... ] ][FIRST | AFTER column_name] |
| 247 | -| CHANGE [ COLUMN ] old_column_name new_column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [{[ COLLATE collation ] | [ column_constraint ]} [ ... ] ] [FIRST | AFTER column_name] | 247 | +| CHANGE [ COLUMN ] old_column_name new_column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [{[ COLLATE collation ] | [column_constraint ]} [ ... ] ] [FIRST | AFTER column_name] |
| 248 | -| DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] | 248 | +| DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] |
| 249 | -| ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] | 249 | +| ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] |
| 250 | -| ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } | 250 | +| ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } |
| 251 | -| ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL | 251 | +| ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL |
| 252 | -| ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer | 252 | +| ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer |
| 253 | -| ADD STATISTICS (( column_1_name, column_2_name [, ...] )) | 253 | +| ADD STATISTICS (( column_1_name, column_2_name [, ...] )) |
| 254 | -| DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) | 254 | +| DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) |
| 255 | -| ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) | 255 | +| ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) |
| 256 | -| ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) | 256 | +| ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) |
| 257 | | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } | 257 | | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } |
| 258 | +| ALTER [ COLUMN ] column_name ADD GENERATED generated_when AS IDENTITY [ ( seq_options) ] | ||
| 259 | +| ALTER [ COLUMN ] column_name alter_identity_column_options [ ... ] | ||
| 260 | +| ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ] | ||
| 258 | ``` | 261 | ``` |
| 259 | 262 | ||
| 260 | > + **ADD \[ COLUMN \] \[ IF NOT EXISTS \] column\_name data\_type [ CHARACTER SET | CHARSET [ = ] charset ] \[ compress\_mode \] \[ COLLATE collation \] \[ column\_constraint \[ ... \] \] \[ FIRST | AFTER column\_name\]** | 263 | > + **ADD \[ COLUMN \] \[ IF NOT EXISTS \] column\_name data\_type [ CHARACTER SET | CHARSET [ = ] charset ] \[ compress\_mode \] \[ COLLATE collation \] \[ column\_constraint \[ ... \] \] \[ FIRST | AFTER column\_name\]** |
| @@ -297,6 +300,8 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 297 | > | 300 | > |
| 298 | > 此子句与上一子句中“MODIFY column\_name data\_type”部分语法相同,语义功能不同,当GUC参数b\_format\_behavior\_compat\_options含有'enable\_modify\_column'选项时,将按照此子句功能处理。 | 301 | > 此子句与上一子句中“MODIFY column\_name data\_type”部分语法相同,语义功能不同,当GUC参数b\_format\_behavior\_compat\_options含有'enable\_modify\_column'选项时,将按照此子句功能处理。 |
| 299 | > | 302 | > |
| 303 | +> 不支持列的identity属性添加/修改和删除。 | ||
| 304 | +> | ||
| 300 | > + **CHANGE \[ COLUMN \] old\_column\_name new\_column\_name data\_type \[ CHARACTER SET | CHARSET charset \] \[\{\[ COLLATE collation \] | \[ column\_constraint \]\} \[ ... \] \] \[FIRST | AFTER column\_name\]** | 305 | > + **CHANGE \[ COLUMN \] old\_column\_name new\_column\_name data\_type \[ CHARACTER SET | CHARSET charset \] \[\{\[ COLLATE collation \] | \[ column\_constraint \]\} \[ ... \] \] \[FIRST | AFTER column\_name\]** |
| 301 | > | 306 | > |
| 302 | > 修改表已存在字段的名称和定义,字段新名称不能是已有字段的名称,将用新名称和定义替换字段原名称和定义原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束)等不会被删除。\[FIRST | AFTER column\_name\]语法表示修改字段名称和定义的同时修改字段在表中的位置。 | 307 | > 修改表已存在字段的名称和定义,字段新名称不能是已有字段的名称,将用新名称和定义替换字段原名称和定义原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束)等不会被删除。\[FIRST | AFTER column\_name\]语法表示修改字段名称和定义的同时修改字段在表中的位置。 |
| @@ -311,6 +316,8 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 311 | > | 316 | > |
| 312 | > 修改字段的字符集或字符序会将字段中的数据转换为新的字符集进行编码。 | 317 | > 修改字段的字符集或字符序会将字段中的数据转换为新的字符集进行编码。 |
| 313 | > | 318 | > |
| 319 | +> 不支持列的identity属性添加/修改和删除。 | ||
| 320 | +> | ||
| 314 | > + **DROP \[ COLUMN \] \[ IF EXISTS \] column\_name \[ RESTRICT | CASCADE \]** | 321 | > + **DROP \[ COLUMN \] \[ IF EXISTS \] column\_name \[ RESTRICT | CASCADE \]** |
| 315 | > | 322 | > |
| 316 | > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 | 323 | > 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 |
| @@ -354,26 +361,40 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 354 | > | 361 | > |
| 355 | > - **ALTER \[ COLUMN \] column\_name SET STORAGE \{ PLAIN | EXTERNAL | EXTENDED | MAIN \}** | 362 | > - **ALTER \[ COLUMN \] column\_name SET STORAGE \{ PLAIN | EXTERNAL | EXTENDED | MAIN \}** |
| 356 | > | 363 | > |
| 357 | -> 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 | 364 | +> 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 |
| 365 | +> | ||
| 366 | +> - **ALTER \[ COLUMN \] column\_name ADD GENERATED generated\_when AS IDENTITY \[ \( seq_options\) \]** | ||
| 367 | +> | ||
| 368 | +> 添加identity属性,同时可以指定identity列的起始值,步长,最大值,最小值等属性。 | ||
| 369 | +> | ||
| 370 | +> - **ALTER \[ COLUMN \] column_name alter\_identity\_column\_options \[ ... \]** | ||
| 371 | +> | ||
| 372 | +> 修改identity列的属性,序列的起始值,最大值,最小值,步长等。 | ||
| 373 | +> | ||
| 374 | +> - **ALTER \[ COLUMN \] column\_name DROP IDENTITY \[ IF EXISTS \]** | ||
| 375 | +> | ||
| 376 | +> 删除某列的identity属性,如果列没有identity属性则报错,如果声明了`IF EXISTS`语法则会跳过;成功删除后,identity列所拥有的序列也会被删除,但是列的not null约束不变。 | ||
| 358 | 377 | ||
| 359 | - 其中列约束column\_constraint为: | 378 | - 其中列约束column\_constraint为: |
| 360 | 379 | ||
| 361 | ``` | 380 | ``` |
| 362 | [ CONSTRAINT constraint_name ] | 381 | [ CONSTRAINT constraint_name ] |
| 363 | - { NOT NULL | | 382 | + { NOT NULL | |
| 364 | - NULL | | 383 | + NULL | |
| 365 | - CHECK ( expression ) | | 384 | + CHECK ( expression ) | |
| 366 | - DEFAULT default_expr | | 385 | + DEFAULT default_expr | |
| 367 | - GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 386 | + GENERATED [ ALWAYS | BY DEFAULT ] AS IDENTITY [ ( seq_options ) ] | |
| 368 | - AUTO_INCREMENT | | 387 | + GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 369 | - ON UPDATE update_expr | | 388 | + ON UPDATE update_expr | |
| 370 | - UNIQUE [KEY] index_parameters | | 389 | + { UNIQUE [KEY] index_parameters [ ON filegroup ] | |
| 371 | - PRIMARY KEY index_parameters | | 390 | + PRIMARY KEY index_parameters [ ON filegroup ] |
| 372 | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | 391 | + } [ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] | |
| 373 | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] | 392 | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] |
| 374 | - [ ON DELETE action ] [ ON UPDATE action ] } | 393 | + [ ON DELETE action ] [ ON UPDATE action ] [ ENABLE ] } | |
| 375 | - [ ENABLE [VALIDATE | NOVALIDATE] | DISABLE [VALIDATE | NOVALIDATE] ] | 394 | + { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] Constraint constraint_name } | |
| 376 | - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | 395 | + AUTO_INCREMENT | |
| 396 | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | | ||
| 397 | + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] | | ||
| 377 | [ COMMENT 'text' ] | 398 | [ COMMENT 'text' ] |
| 378 | ``` | 399 | ``` |
| 379 | 400 | ||
| @@ -411,6 +432,33 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 411 | [ USING INDEX TABLESPACE tablespace_name ] | 432 | [ USING INDEX TABLESPACE tablespace_name ] |
| 412 | ``` | 433 | ``` |
| 413 | 434 | ||
| 435 | +- 其中identity属性参数generated\_when为: | ||
| 436 | + | ||
| 437 | + ```EBNF | ||
| 438 | + ALWAYS | BY DEFAULT | ||
| 439 | + ``` | ||
| 440 | + | ||
| 441 | +- 其中identity属性序列参数seq\_options为: | ||
| 442 | + | ||
| 443 | + ```EBNF | ||
| 444 | + seq_option | ||
| 445 | + | OWNED BY name | ||
| 446 | + | RESTART [ WITH ] NumericOnly | ||
| 447 | + ; | ||
| 448 | + | ||
| 449 | + seq_option: | ||
| 450 | + { MAXVALUE | MINVALUE | START WITH | START | INCREMENT [ BY ] | CACHE } NumericOnly | ||
| 451 | + | { NOMAXVALUE | MINVALUE | NO MAXVALUE | NO MINVALUE | NOCYCLE | [ NO ] CYCLE } | ||
| 452 | + ``` | ||
| 453 | + | ||
| 454 | +- 其中修改identity属性参数alter\_identity\_column\_options为: | ||
| 455 | + | ||
| 456 | + ```EBNF | ||
| 457 | + RESTART [ WITH ] NumericOnly | ||
| 458 | + | SET GENERATED generated_when | ||
| 459 | + | SET seq_option | ||
| 460 | + ``` | ||
| 461 | + | ||
| 414 | - 重命名表。对名称的修改不会影响所存储的数据。 | 462 | - 重命名表。对名称的修改不会影响所存储的数据。 |
| 415 | 463 | ||
| 416 | ``` | 464 | ``` |
| @@ -647,6 +695,26 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 647 | 695 | ||
| 648 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 | 696 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 |
| 649 | 697 | ||
| 698 | +- **GENERATED \[ ALWAYS | BY DEFAULT \] AS IDENTITY \[ \( seq\_options \) \]** | ||
| 699 | + | ||
| 700 | + 该语句创建identity列,用于生成自增/自减的序列。 | ||
| 701 | + | ||
| 702 | + 若在插入时不指定此列的值(或者指定为DEFAULT),则会默认生成。 | ||
| 703 | + | ||
| 704 | + 当列定义为`GANERATED ALWAYS`时,若想插入用户值需要使用`OVERRIDING SYSTEM VALUE`子句,否则会报错,对于UPDATE只能更新为`DEFAULT`; | ||
| 705 | + 当列定义为`GANERATED BY DEFAULT`时,用户提供的值会优先于默认值。 | ||
| 706 | + | ||
| 707 | + `seq_options`可以用于指定序列的选项。 | ||
| 708 | + | ||
| 709 | + >[!NOTE]说明 | ||
| 710 | + > | ||
| 711 | + >- 该列的数据类型仅为整型,NUMERIC类型,该列隐式包含`NOT NULL`约束。 | ||
| 712 | + >- 无法同时定义default,serial,auto_increment,生成列,NULL约束。 | ||
| 713 | + >- 序列生成非事务操作,当列/表约束检查失败,触发器失败时该列已生成的值不会回滚。 | ||
| 714 | + >- 用户自定义的值不会影响该列的下一个值的生成, | ||
| 715 | + >- 可以定义多列,但同一列不能重复定义。 | ||
| 716 | + >- 不支持分区表。 | ||
| 717 | + | ||
| 650 | - **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** | 718 | - **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** |
| 651 | 719 | ||
| 652 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 | 720 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 |
| @@ -808,7 +876,8 @@ ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET | |||
| 808 | 876 | ||
| 809 | 请参考CREATE TABLE的[示例](create_table.md#zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8)。 | 877 | 请参考CREATE TABLE的[示例](create_table.md#zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8)。 |
| 810 | 878 | ||
| 811 | -``` | 879 | +- add column first/after示例 |
| 880 | +```sql | ||
| 812 | -- 创建B模式数据库。 | 881 | -- 创建B模式数据库。 |
| 813 | openGauss=# create database test_first_after dbcompatibility 'b'; | 882 | openGauss=# create database test_first_after dbcompatibility 'b'; |
| 814 | openGauss=# \c test_first_after | 883 | openGauss=# \c test_first_after |
| @@ -845,6 +914,67 @@ openGauss=# alter table t1 add constraint uniq_a unique (f1) invisible; | |||
| 845 | openGauss=# alter table t1 alter index uniq_a visible; | 914 | openGauss=# alter table t1 alter index uniq_a visible; |
| 846 | ``` | 915 | ``` |
| 847 | 916 | ||
| 917 | +- 添加/修改/删除identity列 | ||
| 918 | +```sql | ||
| 919 | +openGauss=# create table t1 (a int generated always as identity, b int); | ||
| 920 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq" for serial column "t1.a" | ||
| 921 | +CREATE TABLE | ||
| 922 | +openGauss=# \d+ t1 | ||
| 923 | + Table "public.t1" | ||
| 924 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 925 | +--------+---------+---------------------------------------+---------+--------------+------------- | ||
| 926 | + a | integer | not null generated always as identity | plain | | | ||
| 927 | + b | integer | | plain | | | ||
| 928 | +Has OIDs: no | ||
| 929 | +Options: orientation=row, compression=no | ||
| 930 | + | ||
| 931 | +openGauss=# alter table t1 add column c numeric(20, 0) generated by default as identity; | ||
| 932 | +NOTICE: ALTER TABLE will create implicit sequence "t1_c_seq" for serial column "t1.c" | ||
| 933 | +ALTER TABLE | ||
| 934 | +openGauss=# \d+ t1 | ||
| 935 | + Table "public.t1" | ||
| 936 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 937 | +--------+---------------+-------------------------------------------+---------+--------------+------------- | ||
| 938 | + a | integer | not null generated always as identity | plain | | | ||
| 939 | + b | integer | | plain | | | ||
| 940 | + c | numeric(20,0) | not null generated by default as identity | main | | | ||
| 941 | +Has OIDs: no | ||
| 942 | +Options: orientation=row, compression=no | ||
| 943 | + | ||
| 944 | +openGauss=# alter table t1 alter column c set generated always set start with 10; | ||
| 945 | +ALTER TABLE | ||
| 946 | +openGauss=# \d+ t1 | ||
| 947 | + Table "public.t1" | ||
| 948 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 949 | +--------+---------------+---------------------------------------+---------+--------------+------------- | ||
| 950 | + a | integer | not null generated always as identity | plain | | | ||
| 951 | + b | integer | | plain | | | ||
| 952 | + c | numeric(20,0) | not null generated always as identity | main | | | ||
| 953 | +Has OIDs: no | ||
| 954 | +Options: orientation=row, compression=no | ||
| 955 | + | ||
| 956 | +openGauss=# alter table t1 alter column b drop identity; | ||
| 957 | +ERROR: column "b" of relation "t1" is not an identity column | ||
| 958 | +openGauss=# alter table t1 alter column b drop identity if exists; | ||
| 959 | +NOTICE: column "b" of relation "t1" is not an identity column, skipping | ||
| 960 | +ALTER TABLE | ||
| 961 | +openGauss=# alter table t1 alter column c drop identity; | ||
| 962 | +ALTER TABLE | ||
| 963 | +openGauss=# alter table t1 alter column c add generated by default as identity(start with 10 increment 20); | ||
| 964 | +NOTICE: ALTER TABLE will create implicit sequence "t1_c_seq1" for serial column "t1.c" | ||
| 965 | +ALTER TABLE | ||
| 966 | +openGauss=# \d+ t1 | ||
| 967 | + Table "public.t1" | ||
| 968 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 969 | +--------+---------------+-------------------------------------------+---------+--------------+------------- | ||
| 970 | + a | integer | not null generated always as identity | plain | | | ||
| 971 | + b | integer | | plain | | | ||
| 972 | + c | numeric(20,0) | not null generated by default as identity | main | | | ||
| 973 | +Has OIDs: no | ||
| 974 | +Options: orientation=row, compression=no | ||
| 975 | + | ||
| 976 | +``` | ||
| 977 | + | ||
| 848 | ## 相关链接<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s489a6430be6447c193a4011257dc4994"></a> | 978 | ## 相关链接<a name="zh-cn_topic_0283137126_zh-cn_topic_0237122076_zh-cn_topic_0059779051_s489a6430be6447c193a4011257dc4994"></a> |
| 849 | 979 | ||
| 850 | [CREATE TABLE](create_table.md),[DROP TABLE](drop_table.md) | 980 | [CREATE TABLE](create_table.md),[DROP TABLE](drop_table.md) |
| @@ -50,6 +50,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 50 | CHECK ( expression ) | | 50 | CHECK ( expression ) | |
| 51 | DEFAULT default_expr | | 51 | DEFAULT default_expr | |
| 52 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | | 52 | GENERATED ALWAYS AS ( generation_expr ) [STORED] | |
| 53 | + GENERATED [ ALWAYS | BY DEFAULT ] AS IDENTITY [ ( seq_options ) ] | | ||
| 53 | AUTO_INCREMENT | | 54 | AUTO_INCREMENT | |
| 54 | ON UPDATE update_expr | | 55 | ON UPDATE update_expr | |
| 55 | UNIQUE [KEY] index_parameters | | 56 | UNIQUE [KEY] index_parameters | |
| @@ -85,7 +86,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 85 | - 其中like选项like\_option为: | 86 | - 其中like选项like\_option为: |
| 86 | 87 | ||
| 87 | ``` | 88 | ``` |
| 88 | - { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL } | 89 | + { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | IDENTITY | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL } |
| 89 | ``` | 90 | ``` |
| 90 | 91 | ||
| 91 | - 其中索引参数index\_parameters为: | 92 | - 其中索引参数index\_parameters为: |
| @@ -95,6 +96,13 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 95 | [ USING INDEX TABLESPACE tablespace_name ] | 96 | [ USING INDEX TABLESPACE tablespace_name ] |
| 96 | ``` | 97 | ``` |
| 97 | 98 | ||
| 99 | +- 其中seq\_options为: | ||
| 100 | + ``` | ||
| 101 | + { MAXVALUE | MINVALUE | START WITH | START | INCREMENT [ BY ] | CACHE | RESTART [ WITH ] } NumericOnly | ||
| 102 | + | { NOMAXVALUE | MINVALUE | NO MAXVALUE | NO MINVALUE | NOCYCLE | [ NO ] CYCLE } | ||
| 103 | + | OWNED BY name | ||
| 104 | + ``` | ||
| 105 | + | ||
| 98 | ## 参数说明<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s99cf2ac11c79436c93385e4efd7c4428"></a> | 106 | ## 参数说明<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s99cf2ac11c79436c93385e4efd7c4428"></a> |
| 99 | 107 | ||
| 100 | - **UNLOGGED** | 108 | - **UNLOGGED** |
| @@ -311,7 +319,8 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 311 | - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 | 319 | - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 |
| 312 | - ATUO_INCREMENT列需要为主键或唯一约束的第一个字段,若复制包含AUTO_INCREAMENT列的表时指定EXCLUDING INDEX,将会报错。其中AUTO_INCREAMENT只在B库中生效。 | 320 | - ATUO_INCREMENT列需要为主键或唯一约束的第一个字段,若复制包含AUTO_INCREAMENT列的表时指定EXCLUDING INDEX,将会报错。其中AUTO_INCREAMENT只在B库中生效。 |
| 313 | - 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 | 321 | - 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 |
| 314 | - | 322 | + - INCLUDING IDENTITY用于复制表列的identity属性,会创建新的序列而不会复制潜在序列的选项,新序列选项默认。该选项不支持分区表。 |
| 323 | + | ||
| 315 | >[!TIP]须知 | 324 | >[!TIP]须知 |
| 316 | > | 325 | > |
| 317 | >- 如果源表包含serial、bigserial、smallserial、largeserial类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE ... OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 | 326 | >- 如果源表包含serial、bigserial、smallserial、largeserial类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE ... OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 |
| @@ -323,7 +332,7 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 323 | >- 如果源表是本地临时表,则新表也必须是本地临时表,否则会报错。 | 332 | >- 如果源表是本地临时表,则新表也必须是本地临时表,否则会报错。 |
| 324 | > | 333 | > |
| 325 | >- 如果源表是hash或list分区表,则在CREATE TABLE ... (LIKE ... INCLUDIING PARTITION)时会报错,不支持复制hash或list分区表的分区,仅支持range分区。对于二级分区表,同样只支持range-range二级分区。 | 334 | >- 如果源表是hash或list分区表,则在CREATE TABLE ... (LIKE ... INCLUDIING PARTITION)时会报错,不支持复制hash或list分区表的分区,仅支持range分区。对于二级分区表,同样只支持range-range二级分区。 |
| 326 | - | 335 | + |
| 327 | - **WITH \( \{ storage\_parameter = value \} \[, ... \] \)** | 336 | - **WITH \( \{ storage\_parameter = value \} \[, ... \] \)** |
| 328 | 337 | ||
| 329 | 这个子句为表或索引指定一个可选的存储参数。用于表的WITH子句还可以包含OIDS=FALSE表示不分配OID。 | 338 | 这个子句为表或索引指定一个可选的存储参数。用于表的WITH子句还可以包含OIDS=FALSE表示不分配OID。 |
| @@ -495,9 +504,9 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 495 | 取值范围:on/off。 | 504 | 取值范围:on/off。 |
| 496 | 505 | ||
| 497 | 默认值:on。 | 506 | 默认值:on。 |
| 498 | - | 507 | + |
| 499 | - + collate | 508 | + - collate |
| 500 | - | 509 | + |
| 501 | 在B模式数据库下(即sql\_compatibility = 'B')用于记录表的默认字符序,一般只用于内部存储和导入导出,不推荐用户指定或修改。 | 510 | 在B模式数据库下(即sql\_compatibility = 'B')用于记录表的默认字符序,一般只用于内部存储和导入导出,不推荐用户指定或修改。 |
| 502 | 511 | ||
| 503 | 取值范围:B模式数据库中独立支持的字符序的oid。 | 512 | 取值范围:B模式数据库中独立支持的字符序的oid。 |
| @@ -565,7 +574,8 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 565 | 574 | ||
| 566 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 | 575 | 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 |
| 567 | 576 | ||
| 568 | -+ **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** | 577 | + |
| 578 | +- **GENERATED ALWAYS AS \( generation\_expr \) \[STORED\]** | ||
| 569 | 579 | ||
| 570 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 | 580 | 该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation\_expr计算得到,STORED表示像普通列一样存储生成列的值。 |
| 571 | 581 | ||
| @@ -581,6 +591,26 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 581 | >- 生成列的权限控制和普通列一样。 | 591 | >- 生成列的权限控制和普通列一样。 |
| 582 | >- 列存表、内存表MOT不支持生成列。外表中仅postgres\_fdw支持生成列。 | 592 | >- 列存表、内存表MOT不支持生成列。外表中仅postgres\_fdw支持生成列。 |
| 583 | 593 | ||
| 594 | +- **GENERATED \[ ALWAYS | BY DEFAULT \] AS IDENTITY \[ \( seq\_options \) \]** | ||
| 595 | + | ||
| 596 | + 该语句创建identity列,用于生成自增/自减的序列。 | ||
| 597 | + | ||
| 598 | + 若在插入时不指定此列的值(或者指定为DEFAULT),则会默认生成。 | ||
| 599 | + | ||
| 600 | + 当列定义为`GANERATED ALWAYS`时,若想插入用户值需要使用`OVERRIDING SYSTEM VALUE`子句,否则会报错,对于UPDATE只能更新为`DEFAULT`; | ||
| 601 | + 当列定义为`GANERATED BY DEFAULT`时,用户提供的值会优先于默认值。 | ||
| 602 | + | ||
| 603 | + `seq_options`可以用于指定序列的选项。 | ||
| 604 | + | ||
| 605 | + >[!NOTE]说明 | ||
| 606 | + > | ||
| 607 | + >- 该列的数据类型仅为整型,NUMERIC类型,该列隐式包含`NOT NULL`约束。 | ||
| 608 | + >- 无法同时定义default,serial,auto_increment,生成列,NULL约束。 | ||
| 609 | + >- 序列生成非事务操作,当列/表约束检查失败,触发器失败时该列已生成的值不会回滚。 | ||
| 610 | + >- 用户自定义的值不会影响该列的下一个值的生成, | ||
| 611 | + >- 可以定义多列,但同一列不能重复定义。 | ||
| 612 | + >- 不支持分区表。 | ||
| 613 | + | ||
| 584 | - **AUTO\_INCREMENT** | 614 | - **AUTO\_INCREMENT** |
| 585 | 615 | ||
| 586 | 该关键字将字段指定为自动增长列。 | 616 | 该关键字将字段指定为自动增长列。 |
| @@ -700,8 +730,8 @@ CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXI | |||
| 700 | 730 | ||
| 701 | ## 示例<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8"></a> | 731 | ## 示例<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_s86758dcf05d442d2a9ebd272e76ed1b8"></a> |
| 702 | 732 | ||
| 703 | -``` | 733 | +- 创建简单的表。 |
| 704 | ---创建简单的表。 | 734 | +```sql |
| 705 | openGauss=# CREATE TABLE tpcds.warehouse_t1 | 735 | openGauss=# CREATE TABLE tpcds.warehouse_t1 |
| 706 | ( | 736 | ( |
| 707 | W_WAREHOUSE_SK INTEGER NOT NULL, | 737 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -739,8 +769,8 @@ openGauss=# CREATE TABLE tpcds.warehouse_t2 | |||
| 739 | ); | 769 | ); |
| 740 | ``` | 770 | ``` |
| 741 | 771 | ||
| 742 | -``` | 772 | +- 创建表,并指定W_STATE字段的缺省值为GA。 |
| 743 | ---创建表,并指定W_STATE字段的缺省值为GA。 | 773 | +```sql |
| 744 | openGauss=# CREATE TABLE tpcds.warehouse_t3 | 774 | openGauss=# CREATE TABLE tpcds.warehouse_t3 |
| 745 | ( | 775 | ( |
| 746 | W_WAREHOUSE_SK INTEGER NOT NULL, | 776 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -779,8 +809,8 @@ openGauss=# CREATE TABLE tpcds.warehouse_t4 | |||
| 779 | ); | 809 | ); |
| 780 | ``` | 810 | ``` |
| 781 | 811 | ||
| 782 | -``` | 812 | +- 创建一个带有70%填充因子的表。 |
| 783 | ---创建一个带有70%填充因子的表。 | 813 | +```sql |
| 784 | openGauss=# CREATE TABLE tpcds.warehouse_t5 | 814 | openGauss=# CREATE TABLE tpcds.warehouse_t5 |
| 785 | ( | 815 | ( |
| 786 | W_WAREHOUSE_SK INTEGER NOT NULL, | 816 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -819,7 +849,10 @@ openGauss=# CREATE TABLE tpcds.warehouse_t6 | |||
| 819 | W_GMT_OFFSET DECIMAL(5,2) | 849 | W_GMT_OFFSET DECIMAL(5,2) |
| 820 | ) WITH(fillfactor=70); | 850 | ) WITH(fillfactor=70); |
| 821 | 851 | ||
| 822 | ---创建表,并指定该表数据不写入预写日志。 | 852 | +``` |
| 853 | + | ||
| 854 | +- 创建表,并指定该表数据不写入预写日志。 | ||
| 855 | +```sql | ||
| 823 | openGauss=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 | 856 | openGauss=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 |
| 824 | ( | 857 | ( |
| 825 | W_WAREHOUSE_SK INTEGER NOT NULL, | 858 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -837,8 +870,10 @@ openGauss=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 | |||
| 837 | W_COUNTRY VARCHAR(20) , | 870 | W_COUNTRY VARCHAR(20) , |
| 838 | W_GMT_OFFSET DECIMAL(5,2) | 871 | W_GMT_OFFSET DECIMAL(5,2) |
| 839 | ); | 872 | ); |
| 873 | +``` | ||
| 840 | 874 | ||
| 841 | ---创建表临时表。 | 875 | +- 创建表临时表。 |
| 876 | +```sql | ||
| 842 | openGauss=# CREATE TEMPORARY TABLE warehouse_t24 | 877 | openGauss=# CREATE TEMPORARY TABLE warehouse_t24 |
| 843 | ( | 878 | ( |
| 844 | W_WAREHOUSE_SK INTEGER NOT NULL, | 879 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -885,7 +920,10 @@ openGauss=# CREATE GLOBAL TEMPORARY TABLE gtt1 | |||
| 885 | POSTCODE CHAR(6) | 920 | POSTCODE CHAR(6) |
| 886 | ) ON COMMIT PRESERVE ROWS; | 921 | ) ON COMMIT PRESERVE ROWS; |
| 887 | 922 | ||
| 888 | ---创建表时,不希望因为表已存在而报错。 | 923 | +``` |
| 924 | + | ||
| 925 | +- 创建表时,不希望因为表已存在而报错。 | ||
| 926 | +```sql | ||
| 889 | openGauss=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 | 927 | openGauss=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 |
| 890 | ( | 928 | ( |
| 891 | W_WAREHOUSE_SK INTEGER NOT NULL, | 929 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -903,8 +941,10 @@ openGauss=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 | |||
| 903 | W_COUNTRY VARCHAR(20) , | 941 | W_COUNTRY VARCHAR(20) , |
| 904 | W_GMT_OFFSET DECIMAL(5,2) | 942 | W_GMT_OFFSET DECIMAL(5,2) |
| 905 | ); | 943 | ); |
| 944 | +``` | ||
| 906 | 945 | ||
| 907 | ---创建普通表空间。 | 946 | +- 创建普通表空间。 |
| 947 | +```sql | ||
| 908 | openGauss=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1'; | 948 | openGauss=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1'; |
| 909 | --创建表时,指定表空间。 | 949 | --创建表时,指定表空间。 |
| 910 | openGauss=# CREATE TABLE tpcds.warehouse_t9 | 950 | openGauss=# CREATE TABLE tpcds.warehouse_t9 |
| @@ -945,8 +985,8 @@ openGauss=# CREATE TABLE tpcds.warehouse_t10 | |||
| 945 | ); | 985 | ); |
| 946 | ``` | 986 | ``` |
| 947 | 987 | ||
| 948 | -``` | 988 | +- 创建一个有主键约束的表。 |
| 949 | ---创建一个有主键约束的表。 | 989 | +```sql |
| 950 | openGauss=# CREATE TABLE tpcds.warehouse_t11 | 990 | openGauss=# CREATE TABLE tpcds.warehouse_t11 |
| 951 | ( | 991 | ( |
| 952 | W_WAREHOUSE_SK INTEGER PRIMARY KEY, | 992 | W_WAREHOUSE_SK INTEGER PRIMARY KEY, |
| @@ -1024,7 +1064,10 @@ openGauss=# CREATE TABLE tpcds.warehouse_t14 | |||
| 1024 | W_GMT_OFFSET DECIMAL(5,2), | 1064 | W_GMT_OFFSET DECIMAL(5,2), |
| 1025 | CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) | 1065 | CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) |
| 1026 | ); | 1066 | ); |
| 1027 | ---创建列存表。 | 1067 | +``` |
| 1068 | + | ||
| 1069 | +- 创建列存表。 | ||
| 1070 | +```sql | ||
| 1028 | openGauss=# CREATE TABLE tpcds.warehouse_t15 | 1071 | openGauss=# CREATE TABLE tpcds.warehouse_t15 |
| 1029 | ( | 1072 | ( |
| 1030 | W_WAREHOUSE_SK INTEGER NOT NULL, | 1073 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -1082,8 +1125,10 @@ openGauss=# CREATE TABLE tpcds.warehouse_t17 | |||
| 1082 | W_GMT_OFFSET DECIMAL(5,2) | 1125 | W_GMT_OFFSET DECIMAL(5,2) |
| 1083 | ) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); | 1126 | ) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); |
| 1084 | 1127 | ||
| 1128 | +``` | ||
| 1085 | 1129 | ||
| 1086 | ---定义一个检查列约束。 | 1130 | +- 定义一个检查列约束。 |
| 1131 | +```sql | ||
| 1087 | openGauss=# CREATE TABLE tpcds.warehouse_t19 | 1132 | openGauss=# CREATE TABLE tpcds.warehouse_t19 |
| 1088 | ( | 1133 | ( |
| 1089 | W_WAREHOUSE_SK INTEGER PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0), | 1134 | W_WAREHOUSE_SK INTEGER PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0), |
| @@ -1121,7 +1166,10 @@ openGauss=# CREATE TABLE tpcds.warehouse_t20 | |||
| 1121 | CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) | 1166 | CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) |
| 1122 | ); | 1167 | ); |
| 1123 | 1168 | ||
| 1124 | ---创建一个有外键约束的表。 | 1169 | +``` |
| 1170 | + | ||
| 1171 | +- 创建一个有外键约束的表。 | ||
| 1172 | +```sql | ||
| 1125 | openGauss=# CREATE TABLE tpcds.city_t23 | 1173 | openGauss=# CREATE TABLE tpcds.city_t23 |
| 1126 | ( | 1174 | ( |
| 1127 | W_CITY VARCHAR(60) PRIMARY KEY, | 1175 | W_CITY VARCHAR(60) PRIMARY KEY, |
| @@ -1185,30 +1233,40 @@ openGauss=# CREATE TABLE tpcds.warehouse_t23 | |||
| 1185 | CONSTRAINT W_FORE_KEY1 FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) | 1233 | CONSTRAINT W_FORE_KEY1 FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) |
| 1186 | ); | 1234 | ); |
| 1187 | 1235 | ||
| 1188 | ---向tpcds.warehouse_t19表中增加一个varchar列。 | ||
| 1189 | ``` | 1236 | ``` |
| 1190 | 1237 | ||
| 1191 | -``` | 1238 | +- 向tpcds.warehouse_t19表中增加一个varchar列。 |
| 1239 | +```sql | ||
| 1192 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30); | 1240 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30); |
| 1193 | 1241 | ||
| 1194 | ---给tpcds.warehouse_t19表增加一个检查约束。 | 1242 | +``` |
| 1195 | -openGauss=# ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL); | ||
| 1196 | 1243 | ||
| 1197 | ---在一个操作中改变两个现存字段的类型。 | 1244 | +- 给tpcds.warehouse_t19表增加一个检查约束。 |
| 1245 | +```sql | ||
| 1246 | +openGauss=# ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL); | ||
| 1247 | +``` | ||
| 1248 | + | ||
| 1249 | +- 在一个操作中改变两个现存字段的类型。 | ||
| 1250 | +```sql | ||
| 1198 | openGauss=# ALTER TABLE tpcds.warehouse_t19 | 1251 | openGauss=# ALTER TABLE tpcds.warehouse_t19 |
| 1199 | ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80), | 1252 | ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80), |
| 1200 | ALTER COLUMN W_STREET_NAME TYPE varchar(100); | 1253 | ALTER COLUMN W_STREET_NAME TYPE varchar(100); |
| 1201 | 1254 | ||
| 1202 | --此语句与上面语句等效。 | 1255 | --此语句与上面语句等效。 |
| 1203 | openGauss=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60)); | 1256 | openGauss=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60)); |
| 1204 | - | 1257 | +``` |
| 1205 | ---给一个已存在字段添加非空约束。 | 1258 | +- 给一个已存在字段添加非空约束。 |
| 1259 | +```sql | ||
| 1206 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL; | 1260 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL; |
| 1261 | +``` | ||
| 1207 | 1262 | ||
| 1208 | ---移除已存在字段的非空约束。 | 1263 | +- 移除已存在字段的非空约束。 |
| 1264 | +```sql | ||
| 1209 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL; | 1265 | openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL; |
| 1266 | +``` | ||
| 1210 | 1267 | ||
| 1211 | ---如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。 | 1268 | +- 如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。 |
| 1269 | +```sql | ||
| 1212 | openGauss=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK); | 1270 | openGauss=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK); |
| 1213 | 1271 | ||
| 1214 | --查看约束的名称,并删除一个列存表中的局部聚簇列。 | 1272 | --查看约束的名称,并删除一个列存表中的局部聚簇列。 |
| @@ -1236,8 +1294,10 @@ Has OIDs: no | |||
| 1236 | Location Nodes: ALL DATANODES | 1294 | Location Nodes: ALL DATANODES |
| 1237 | Options: compression=no, version=0.12 | 1295 | Options: compression=no, version=0.12 |
| 1238 | openGauss=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster; | 1296 | openGauss=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster; |
| 1297 | +``` | ||
| 1239 | 1298 | ||
| 1240 | ---将表移动到另一个表空间。 | 1299 | +- 将表移动到另一个表空间。 |
| 1300 | +```sql | ||
| 1241 | openGauss=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; | 1301 | openGauss=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; |
| 1242 | --创建模式joe。 | 1302 | --创建模式joe。 |
| 1243 | openGauss=# CREATE SCHEMA joe; | 1303 | openGauss=# CREATE SCHEMA joe; |
| @@ -1248,10 +1308,15 @@ openGauss=# ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe; | |||
| 1248 | --重命名已存在的表。 | 1308 | --重命名已存在的表。 |
| 1249 | openGauss=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23; | 1309 | openGauss=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23; |
| 1250 | 1310 | ||
| 1251 | ---从warehouse_t23表中删除一个字段。 | 1311 | +``` |
| 1252 | -openGauss=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME; | ||
| 1253 | 1312 | ||
| 1254 | ---创建带INVISIBLE唯一索引的表,需要在B兼容性数据库下 | 1313 | +- 从warehouse_t23表中删除一个字段。 |
| 1314 | +```sql | ||
| 1315 | +openGauss=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME; | ||
| 1316 | +``` | ||
| 1317 | + | ||
| 1318 | +- 创建带INVISIBLE唯一索引的表,需要在B兼容性数据库下 | ||
| 1319 | +```sql | ||
| 1255 | openGauss=# CREATE TABLE tpcds.warehouse_t26 | 1320 | openGauss=# CREATE TABLE tpcds.warehouse_t26 |
| 1256 | ( | 1321 | ( |
| 1257 | W_WAREHOUSE_SK INTEGER NOT NULL, | 1322 | W_WAREHOUSE_SK INTEGER NOT NULL, |
| @@ -1301,6 +1366,62 @@ openGauss=# DROP TABLESPACE DS_TABLESPACE1; | |||
| 1301 | openGauss=# DROP SCHEMA IF EXISTS joe CASCADE; | 1366 | openGauss=# DROP SCHEMA IF EXISTS joe CASCADE; |
| 1302 | ``` | 1367 | ``` |
| 1303 | 1368 | ||
| 1369 | +- 创建identity列 | ||
| 1370 | +```sql | ||
| 1371 | +openGauss=# create table t1 (a int generated always as identity, b int); | ||
| 1372 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq" for serial column "t1.a" | ||
| 1373 | +CREATE TABLE | ||
| 1374 | +openGauss=# \d+ t1 | ||
| 1375 | + Table "public.t1" | ||
| 1376 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 1377 | +--------+---------+---------------------------------------+---------+--------------+------------- | ||
| 1378 | + a | integer | not null generated always as identity | plain | | | ||
| 1379 | + b | integer | | plain | | | ||
| 1380 | +Has OIDs: no | ||
| 1381 | +Options: orientation=row, compression=no | ||
| 1382 | + | ||
| 1383 | +openGauss=# create table t2 (a int generated by default as identity, b int); | ||
| 1384 | +NOTICE: CREATE TABLE will create implicit sequence "t2_a_seq" for serial column "t2.a" | ||
| 1385 | +CREATE TABLE | ||
| 1386 | +openGauss=# \d+ t2 | ||
| 1387 | + Table "public.t2" | ||
| 1388 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 1389 | +--------+---------+-------------------------------------------+---------+--------------+------------- | ||
| 1390 | + a | integer | not null generated by default as identity | plain | | | ||
| 1391 | + b | integer | | plain | | | ||
| 1392 | +Has OIDs: no | ||
| 1393 | +Options: orientation=row, compression=no | ||
| 1394 | + | ||
| 1395 | +``` | ||
| 1396 | + | ||
| 1397 | +- create table like (including identity) | ||
| 1398 | +```sql | ||
| 1399 | +openGauss=# create table t2_1 (like t2); | ||
| 1400 | +CREATE TABLE | ||
| 1401 | +openGauss=# \d+ t2_1 | ||
| 1402 | + Table "public.t2_1" | ||
| 1403 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 1404 | +--------+---------+-----------+---------+--------------+------------- | ||
| 1405 | + a | integer | not null | plain | | | ||
| 1406 | + b | integer | | plain | | | ||
| 1407 | +Has OIDs: no | ||
| 1408 | +Options: orientation=row, compression=no | ||
| 1409 | + | ||
| 1410 | +openGauss=# create table t2_2 (like t2 including identity); | ||
| 1411 | +NOTICE: CREATE TABLE will create implicit sequence "t2_2_a_seq" for serial column "t2_2.a" | ||
| 1412 | +CREATE TABLE | ||
| 1413 | +openGauss=# \d+ t2_2 | ||
| 1414 | + Table "public.t2_2" | ||
| 1415 | + Column | Type | Modifiers | Storage | Stats target | Description | ||
| 1416 | +--------+---------+-------------------------------------------+---------+--------------+------------- | ||
| 1417 | + a | integer | not null generated by default as identity | plain | | | ||
| 1418 | + b | integer | | plain | | | ||
| 1419 | +Has OIDs: no | ||
| 1420 | +Options: orientation=row, compression=no | ||
| 1421 | + | ||
| 1422 | +``` | ||
| 1423 | + | ||
| 1424 | + | ||
| 1304 | ## 相关链接<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_scd5caca899f849f697cb50d76c49de4c"></a> | 1425 | ## 相关链接<a name="zh-cn_topic_0283137629_zh-cn_topic_0237122117_zh-cn_topic_0059778169_scd5caca899f849f697cb50d76c49de4c"></a> |
| 1305 | 1426 | ||
| 1306 | [ALTER TABLE](alter_table.md),[DROP TABLE](drop_table.md),[CREATE TABLESPACE](create_tablespace.md) | 1427 | [ALTER TABLE](alter_table.md),[DROP TABLE](drop_table.md),[CREATE TABLESPACE](create_tablespace.md) |
| @@ -30,8 +30,9 @@ | |||
| 30 | INSERT [/*+ plan_hint */] INTO | 30 | INSERT [/*+ plan_hint */] INTO |
| 31 | { table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] | 31 | { table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] |
| 32 | | ( target_query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ) [ AS ] alias [ ( column_name [, ...] ) ] } | 32 | | ( target_query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ) [ AS ] alias [ ( column_name [, ...] ) ] } |
| 33 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 33 | { DEFAULT VALUES | 34 | { DEFAULT VALUES |
| 34 | - | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 35 | + | VALUES { ( { expression | DEFAULT } [, ...] ) } [, ...] |
| 35 | | query } | 36 | | query } |
| 36 | [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] }] | 37 | [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] }] |
| 37 | [ ON CONFLICT [ conflict_target ] conflict_action ] | 38 | [ ON CONFLICT [ conflict_target ] conflict_action ] |
| @@ -98,7 +99,7 @@ INSERT [/*+ plan_hint */] INTO | |||
| 98 | 作为插入目标的子查询,相当于视图,仅在参数sql\_compatibility=A时生效。插入限制详见[CREATE VIEW](create_view.md)中可自动更新视图一节。 | 99 | 作为插入目标的子查询,相当于视图,仅在参数sql\_compatibility=A时生效。插入限制详见[CREATE VIEW](create_view.md)中可自动更新视图一节。 |
| 99 | 100 | ||
| 100 | - **WITH [ CASCADED | LOCAL ] CHECK OPTION** | 101 | - **WITH [ CASCADED | LOCAL ] CHECK OPTION** |
| 101 | - | 102 | + |
| 102 | 详见[CREATE VIEW](create_view.md)一节介绍。 | 103 | 详见[CREATE VIEW](create_view.md)一节介绍。 |
| 103 | 104 | ||
| 104 | - **column\_name** | 105 | - **column\_name** |
| @@ -113,6 +114,12 @@ INSERT [/*+ plan_hint */] INTO | |||
| 113 | 114 | ||
| 114 | 取值范围:已存在的字段名。 | 115 | 取值范围:已存在的字段名。 |
| 115 | 116 | ||
| 117 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 118 | + | ||
| 119 | + 该子句用于插入identity列时的行为控制。 | ||
| 120 | + | ||
| 121 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 122 | + | ||
| 116 | - **expression** | 123 | - **expression** |
| 117 | 124 | ||
| 118 | 赋予对应column的一个有效表达式或值: | 125 | 赋予对应column的一个有效表达式或值: |
| @@ -252,6 +259,8 @@ INSERT [/*+ plan_hint */] INTO | |||
| 252 | 259 | ||
| 253 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> | 260 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> |
| 254 | 261 | ||
| 262 | +- insert语句基础示例 | ||
| 263 | + | ||
| 255 | ```sql | 264 | ```sql |
| 256 | --创建表tpcds.reason_t2。 | 265 | --创建表tpcds.reason_t2。 |
| 257 | openGauss=# CREATE TABLE tpcds.reason_t2 | 266 | openGauss=# CREATE TABLE tpcds.reason_t2 |
| @@ -411,3 +420,26 @@ UPDATE SET email = EXCLUDED.email; | |||
| 411 | INSERT INTO users (id, email, name) | 420 | INSERT INTO users (id, email, name) |
| 412 | VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING; | 421 | VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING; |
| 413 | ``` | 422 | ``` |
| 423 | + | ||
| 424 | +- OVERRIDING 子句示例 | ||
| 425 | +```sql | ||
| 426 | +openGauss=# create table t1 (a int generated always as identity, b int); | ||
| 427 | +NOTICE: CREATE TABLE will create implicit sequence "t1_a_seq" for serial column "t1.a" | ||
| 428 | +CREATE TABLE | ||
| 429 | +openGauss=# insert into t1(a, b) values(1, 1); | ||
| 430 | +ERROR: cannot insert a non-DEFAULT value into column "a" | ||
| 431 | +DETAIL: Column "a" is an identity column defined as "GENERATED ALWAYS". | ||
| 432 | +HINT: Use OVERRIDING SYSTEM VALUE to override. | ||
| 433 | +openGauss=# insert into t1(a, b) OVERRIDING SYSTEM VALUE values(10, 1); | ||
| 434 | +INSERT 0 1 | ||
| 435 | +openGauss=# insert into t1(a, b) OVERRIDING USER VALUE values(10, 1); | ||
| 436 | +INSERT 0 1 | ||
| 437 | +openGauss=# select * from t1 order by a, b; | ||
| 438 | + a | b | ||
| 439 | +----+--- | ||
| 440 | + 1 | 1 | ||
| 441 | + 2 | 1 | ||
| 442 | + 10 | 1 | ||
| 443 | +(3 rows) | ||
| 444 | + | ||
| 445 | +``` | ||
| @@ -22,8 +22,9 @@ ON ( condition ) | |||
| 22 | ] | 22 | ] |
| 23 | [ | 23 | [ |
| 24 | WHEN NOT MATCHED THEN | 24 | WHEN NOT MATCHED THEN |
| 25 | - INSERT { DEFAULT VALUES | | 25 | + INSERT [ ( column_name [, ...] ) ] |
| 26 | - [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | 26 | + [ OVERRIDING { SYSTEM | USER } VALUE ] |
| 27 | + { DEFAULT VALUES | VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } | ||
| 27 | ]; | 28 | ]; |
| 28 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! | 29 | NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode! |
| 29 | ``` | 30 | ``` |
| @@ -91,6 +92,12 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 91 | 92 | ||
| 92 | WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 | 93 | WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 |
| 93 | 94 | ||
| 95 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
| 96 | + | ||
| 97 | + 该子句用于插入identity列时的行为控制。 | ||
| 98 | + | ||
| 99 | + `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 100 | + | ||
| 94 | - **DEFAULT** | 101 | - **DEFAULT** |
| 95 | 102 | ||
| 96 | 用对应字段的缺省值填充该字段。 | 103 | 用对应字段的缺省值填充该字段。 |
| @@ -103,7 +110,8 @@ NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRA | |||
| 103 | 110 | ||
| 104 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> | 111 | ## 示例<a name="zh-cn_topic_0283137308_zh-cn_topic_0237122170_section3650125620712"></a> |
| 105 | 112 | ||
| 106 | -``` | 113 | +- merge into语句基础示例 |
| 114 | +```sql | ||
| 107 | -- 创建目标表products和源表newproducts,并插入数据 | 115 | -- 创建目标表products和源表newproducts,并插入数据 |
| 108 | openGauss=# CREATE TABLE products | 116 | openGauss=# CREATE TABLE products |
| 109 | ( | 117 | ( |
| @@ -156,3 +164,57 @@ openGauss=# SELECT * FROM products ORDER BY product_id; | |||
| 156 | openGauss=# DROP TABLE products; | 164 | openGauss=# DROP TABLE products; |
| 157 | openGauss=# DROP TABLE newproducts; | 165 | openGauss=# DROP TABLE newproducts; |
| 158 | ``` | 166 | ``` |
| 167 | + | ||
| 168 | +- merge into when not matched then insert overriding clause示例 | ||
| 169 | +```sql | ||
| 170 | +openGauss=# create table target_table ( | ||
| 171 | +openGauss(# id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, | ||
| 172 | +openGauss(# name varchar(50), | ||
| 173 | +openGauss(# age int | ||
| 174 | +openGauss(# ); | ||
| 175 | +NOTICE: CREATE TABLE will create implicit sequence "target_table_id_seq" for serial column "target_table.id" | ||
| 176 | +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "target_table_pkey" for table "target_table" | ||
| 177 | +CREATE TABLE | ||
| 178 | +openGauss=# create table source_table (id int, name varchar(50), age int); | ||
| 179 | +CREATE TABLE | ||
| 180 | +openGauss=# insert into source_table values (10, 'zliu', 28), (11, 'sqi', 30); | ||
| 181 | +INSERT 0 2 | ||
| 182 | +openGauss=# -- expected: success. let id generated by system. | ||
| 183 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 184 | +openGauss-# when not matched then | ||
| 185 | +openGauss-# insert (name, age) values (s.name, s.age); | ||
| 186 | +MERGE 2 | ||
| 187 | +openGauss=# -- expected: error | ||
| 188 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 189 | +openGauss-# when not matched then | ||
| 190 | +openGauss-# insert (id, name, age) values (1, 'error', 21); | ||
| 191 | +ERROR: cannot insert a non-DEFAULT value into column "id" | ||
| 192 | +DETAIL: Column "id" is an identity column defined as "GENERATED ALWAYS". | ||
| 193 | +HINT: Use OVERRIDING SYSTEM VALUE to override | ||
| 194 | +openGauss=# -- expected: success | ||
| 195 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 196 | +openGauss-# when not matched then | ||
| 197 | +openGauss-# insert (id, name, age) OVERRIDING USER VALUE values (1, 'success', 22); -- 3 | ||
| 198 | +MERGE 2 | ||
| 199 | +openGauss=# -- expected: error | ||
| 200 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 201 | +openGauss-# when not matched then | ||
| 202 | +openGauss-# insert (id, name, age) OVERRIDING SYSTEM VALUE values (2, 'error', 23); | ||
| 203 | +ERROR: duplicate key value violates unique constraint "target_table_pkey" | ||
| 204 | +DETAIL: Key (id)=(2) already exists. | ||
| 205 | +openGauss=# -- expected: error | ||
| 206 | +openGauss=# merge into target_table AS t using source_table AS s ON t.id = s.id | ||
| 207 | +openGauss-# when not matched then | ||
| 208 | +openGauss-# insert (id, name, age) OVERRIDING SYSTEM VALUE values (3, 'error', 24); | ||
| 209 | +ERROR: duplicate key value violates unique constraint "target_table_pkey" | ||
| 210 | +DETAIL: Key (id)=(3) already exists. | ||
| 211 | +openGauss=# select * from target_table order by 1,2,3; | ||
| 212 | + id | name | age | ||
| 213 | +----+---------+----- | ||
| 214 | + 1 | zliu | 28 | ||
| 215 | + 2 | sqi | 30 | ||
| 216 | + 3 | success | 22 | ||
| 217 | + 4 | success | 22 | ||
| 218 | +(4 rows) | ||
| 219 | + | ||
| 220 | +``` | ||
| @@ -16,6 +16,7 @@ | |||
| 16 | ``` | 16 | ``` |
| 17 | [ WITH [ RECURSIVE ] with_query [, ...] ] | 17 | [ WITH [ RECURSIVE ] with_query [, ...] ] |
| 18 | REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] | 18 | REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] |
| 19 | + [ OVERRIDING { SYSTEM | USER } VALUE ] | ||
| 19 | { DEFAULT VALUES | 20 | { DEFAULT VALUES |
| 20 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | 21 | | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] |
| 21 | | query } | 22 | | query } |
| @@ -80,6 +81,12 @@ NULL。 | |||
| 80 | 81 | ||
| 81 | 取值范围:已存在的字段名。 | 82 | 取值范围:已存在的字段名。 |
| 82 | 83 | ||
| 84 | +- **OVERRIDING \{ SYSTEM | USER \} VALUE** | ||
【问题描述】 create_table.md insert.md replace_into.md 【修改建议】 这三个文件在lite版本也加上,保证lite版本和非lite保持一致,顺便改下冲突 ![]() ![]() | |||
| 85 | + | ||
| 86 | + 该子句用于插入identity列时的行为控制。 | ||
| 87 | + | ||
| 88 | + - `OVERRIDING SYSTEM VALUE`用于覆盖identity列生成的系统值,`OVERRIDING USER VALUE`用于覆盖用户自定义值。 | ||
| 89 | + | ||
| 83 | - **expression** | 90 | - **expression** |
| 84 | 91 | ||
| 85 | 赋予对应column的一个有效表达式或值。 | 92 | 赋予对应column的一个有效表达式或值。 |
| @@ -118,7 +125,9 @@ NULL。 | |||
| 118 | 125 | ||
| 119 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> | 126 | ## 示例<a name="zh-cn_topic_0283137542_zh-cn_topic_0237122167_zh-cn_topic_0059778902_sfff14489321642278317cf06cd89810d"></a> |
| 120 | 127 | ||
| 121 | -``` | 128 | +- replace into语句基础示例 |
| 129 | + | ||
| 130 | +```sql | ||
| 122 | -- 创建表test. | 131 | -- 创建表test. |
| 123 | openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT); | 132 | openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT); |
| 124 | 133 | ||
| @@ -151,4 +160,20 @@ openGauss=# select * from test; | |||
| 151 | 1 | 5 | 160 | 1 | 5 |
| 152 | 2 | 6 | 161 | 2 | 6 |
| 153 | (4 rows) | 162 | (4 rows) |
| 163 | +``` | ||
| 154 | 164 | ||
| 165 | +- OVERRIDING clause示例 | ||
| 166 | +```sql | ||
| 167 | +openGauss=# CREATE TABLE test_t1 (a int GENERATED ALWAYS AS IDENTITY, b text, c int); | ||
| 168 | +NOTICE: CREATE TABLE will create implicit sequence "test_t1_a_seq" for serial column "test_t1.a" | ||
| 169 | +CREATE TABLE | ||
| 170 | +openGauss=# REPLACE INTO test_t1 (a, b, c) VALUES (1, 'alice', 25); -- error | ||
| 171 | +ERROR: cannot insert a non-DEFAULT value into column "a" | ||
| 172 | +DETAIL: Column "a" is an identity column defined as "GENERATED ALWAYS". | ||
| 173 | +HINT: Use OVERRIDING SYSTEM VALUE to override. | ||
| 174 | +openGauss=# -- error REPLACE can not work on sequence! | ||
| 175 | +openGauss=# REPLACE INTO test_t1 (a, b, c) OVERRIDING SYSTEM VALUE VALUES (1, 'alice', 25); | ||
| 176 | +ERROR: REPLACE can not work on sequence! | ||
| 177 | +openGauss=# | ||
| 178 | + | ||
| 179 | +``` | ||


【问题描述】 docs-lite/zh/sql_reference/INSERT.md docs-lite/zh/sql_reference/REPLACE_INTO.md 【修改建议】 这俩文件非lite版本也添加下,保证lite版本和非lite版本保持一致