已合并
[Doc] doc of pg generated as identity #8611
XXXCA创建于 4月29日
[Doc] doc of pg generated as identity #8611
已合并
XXXCA创建于 4月29日
共 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
222openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT);230openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT);
223openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_a UNIQUE CLUSTERED (a);231openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_a UNIQUE CLUSTERED (a);
224openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a);232openGauss=# 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
230create table test1(col1 int primary key with(fillfactor = 20), col2 int);238create table test1(col1 int primary key with(fillfactor = 20), col2 int);
231NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1"239NOTICE: 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.
251NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3"259NOTICE: 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
257create table test1(col1 int primary key with(fillfactor = 20), col2 int);265create table test1(col1 int primary key with(fillfactor = 20), col2 int);
258 266 
259alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1];267alter 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);
269alter table test3 add column col3 int primary key with (data_compression = none) on [primar4];277alter 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
275openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float);318openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float);
276CREATE TABLE319CREATE TABLE
277openGauss=# \d+ ADD_DEFAULT320openGauss=# \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;
234ALTER TABLE240ALTER 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```sql279```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
330openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1370openGauss=# 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 [, ...] ]
16INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ]16INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ]
17+ [ OVERRIDING { SYSTEM | USER } VALUE ]
17 { DEFAULT VALUES18 { 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
51create table t1(c1 int, c2 int);59create table t1(c1 int, c2 int);
52 60 
53insert into t1 values(1, 2);61insert into t1 values(1, 2);
@@ -111,6 +119,62 @@ NOTICE: The nolock option is currently ignored
111NOTICE: The nowait option is currently ignored119NOTICE: 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 THEN26 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];
30NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!31NOTICE: '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,并插入数据
57openGauss=# CREATE TABLE products66openGauss=# CREATE TABLE products
58(67(
@@ -154,6 +163,55 @@ openGauss=# DROP TABLE products;
154openGauss=# DROP TABLE newproducts;163openGauss=# 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 @@
30INSERT [/*+ plan_hint */] INTO30INSERT [/*+ 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 VALUES34 { DEFAULT VALUES
34 | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] 35 | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...]
ywzq1161327784

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

likedislike
XXXCA
XXXCA
7月29日 评论:
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```sql263```sql
255--创建表tpcds.reason_t2。264--创建表tpcds.reason_t2。
256openGauss=# CREATE TABLE tpcds.reason_t2265openGauss=# CREATE TABLE tpcds.reason_t2
@@ -410,3 +419,26 @@ UPDATE SET email = EXCLUDED.email;
410INSERT INTO users (id, email, name)419INSERT INTO users (id, email, name)
411VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING;420VALUES (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 [, ...] ]
18REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ]18REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ]
19+ [ OVERRIDING { SYSTEM | USER } VALUE ]
19 { DEFAULT VALUES20 { 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.
123openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT);131openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT);
124 132 
@@ -151,4 +159,20 @@ openGauss=# select * from test;
151 1 | 5159 1 | 5
152 2 | 6160 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模式数据库。
775openGauss=# create database test_first_after dbcompatibility 'b';845openGauss=# create database test_first_after dbcompatibility 'b';
776openGauss=# \c test_first_after846openGauss=# \c test_first_after
@@ -807,6 +877,67 @@ openGauss=# alter table t1 add constraint uniq_a unique (f1) invisible;
807openGauss=# alter table t1 alter index uniq_a visible;877openGauss=# 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 THEN24 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];
28NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!29NOTICE: '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,并插入数据
100openGauss=# CREATE TABLE products108openGauss=# CREATE TABLE products
101(109(
@@ -148,3 +156,58 @@ openGauss=# SELECT * FROM products ORDER BY product_id;
148openGauss=# DROP TABLE products;156openGauss=# DROP TABLE products;
149openGauss=# DROP TABLE newproducts;157openGauss=# 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```
222openGauss=# CREATE TABLE alter_table_tbl1 (a INT, b INT);230openGauss=# 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
224openGauss=# ALTER TABLE alter_table_tbl1 ADD CONSTRAINT alter_table_tbl_b PRIMARY KEY NONCLUSTERED (a);232openGauss=# 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
230create table test1(col1 int primary key with(fillfactor = 20), col2 int);238create table test1(col1 int primary key with(fillfactor = 20), col2 int);
231NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test1_pkey" for table "test1"239NOTICE: 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.
251NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test3_pkey" for table "test3"259NOTICE: 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
257create table test1(col1 int primary key with(fillfactor = 20), col2 int);265create table test1(col1 int primary key with(fillfactor = 20), col2 int);
258 266 
259alter table test1 add constraint unique_name unique(col2) with (fillfactor = 50, ignore_dup_key = on) on [primary1];267alter 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 
269alter table test3 add column col3 int primary key with (data_compression = none) on [primar4];277alter 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
275openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float);317openGauss=# create table ADD_DEFAULT(id int, v1 varchar(20), v2 float);
276CREATE TABLE318CREATE TABLE
277openGauss=# \d+ ADD_DEFAULT319openGauss=# \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```sql211```sql
205opengauss=# CREATE TABLE Products(212opengauss=# CREATE TABLE Products(
206opengauss(# QtyAvailable smallint,213opengauss(# QtyAvailable smallint,
@@ -233,6 +240,39 @@ opengauss=# ALTER TABLE Products DROP unitprice;
233ALTER TABLE240ALTER 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```sql278```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```sql360```sql
321openGauss=# CREATE TEMPORARY TABLE #ltt1361openGauss=# 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
329openGauss=# CREATE GLOBAL TEMPORARY TABLE ##gtt1369openGauss=# 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 [, ...] ]
16INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ]16INSERT [/*+ plan_hint */] [INTO] table_name [partition_clause] [ AS alias ] [table_hint_clause] [ ( column_name [, ...] ) ]
17+ [ OVERRIDING { SYSTEM | USER } VALUE ]
17 { DEFAULT VALUES18 { 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
51create table t1(c1 int, c2 int);59create table t1(c1 int, c2 int);
52 60 
53insert into t1 values(1, 2);61insert into t1 values(1, 2);
@@ -111,6 +119,62 @@ NOTICE: The nolock option is currently ignored
111NOTICE: The nowait option is currently ignored119NOTICE: 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 THEN26 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];
30NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!31NOTICE: '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,并插入数据
57openGauss=# CREATE TABLE products67openGauss=# CREATE TABLE products
58(68(
@@ -154,6 +164,55 @@ openGauss=# DROP TABLE products;
154openGauss=# DROP TABLE newproducts;164openGauss=# 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_type243| 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 ] NULL245| 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模式数据库。
813openGauss=# create database test_first_after dbcompatibility 'b';882openGauss=# create database test_first_after dbcompatibility 'b';
814openGauss=# \c test_first_after883openGauss=# \c test_first_after
@@ -845,6 +914,67 @@ openGauss=# alter table t1 add constraint uniq_a unique (f1) invisible;
845openGauss=# alter table t1 alter index uniq_a visible;914openGauss=# 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- + collate508+ - 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
705openGauss=# CREATE TABLE tpcds.warehouse_t1735openGauss=# 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
744openGauss=# CREATE TABLE tpcds.warehouse_t3774openGauss=# 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
784openGauss=# CREATE TABLE tpcds.warehouse_t5814openGauss=# 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
823openGauss=# CREATE UNLOGGED TABLE tpcds.warehouse_t7856openGauss=# 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
842openGauss=# CREATE TEMPORARY TABLE warehouse_t24877openGauss=# 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
889openGauss=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8927openGauss=# 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
908openGauss=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1';948openGauss=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1';
909--创建表时,指定表空间。949--创建表时,指定表空间。
910openGauss=# CREATE TABLE tpcds.warehouse_t9950openGauss=# 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
950openGauss=# CREATE TABLE tpcds.warehouse_t11990openGauss=# 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
1028openGauss=# CREATE TABLE tpcds.warehouse_t151071openGauss=# 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
1087openGauss=# CREATE TABLE tpcds.warehouse_t191132openGauss=# 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
1125openGauss=# CREATE TABLE tpcds.city_t231173openGauss=# 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
1192openGauss=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30);1240openGauss=# 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
1198openGauss=# ALTER TABLE tpcds.warehouse_t191251openGauss=# 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--此语句与上面语句等效。
1203openGauss=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60));1256openGauss=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60));
1204- 1257+```
1205---给一个已存在字段添加非空约束。1258+- 给一个已存在字段添加非空约束。
1259+```sql
1206openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL;1260openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL;
1261+```
1207 1262 
1208---移除已存在字段的非空约束。1263+- 移除已存在字段的非空约束。
1264+```sql
1209openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL;1265openGauss=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL;
1266+```
1210 1267 
1211---如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。1268+- 如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。
1269+```sql
1212openGauss=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK);1270openGauss=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK);
1213 1271 
1214--查看约束的名称,并删除一个列存表中的局部聚簇列。1272--查看约束的名称,并删除一个列存表中的局部聚簇列。
@@ -1236,8 +1294,10 @@ Has OIDs: no
1236Location Nodes: ALL DATANODES1294Location Nodes: ALL DATANODES
1237Options: compression=no, version=0.121295Options: compression=no, version=0.12
1238openGauss=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster;1296openGauss=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster;
1297+```
1239 1298 
1240---将表移动到另一个表空间。1299+- 将表移动到另一个表空间。
1300+```sql
1241openGauss=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; 1301openGauss=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT;
1242--创建模式joe。1302--创建模式joe。
1243openGauss=# CREATE SCHEMA joe;1303openGauss=# CREATE SCHEMA joe;
@@ -1248,10 +1308,15 @@ openGauss=# ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe;
1248--重命名已存在的表。1308--重命名已存在的表。
1249openGauss=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23;1309openGauss=# 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
1255openGauss=# CREATE TABLE tpcds.warehouse_t261320openGauss=# 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;
1301openGauss=# DROP SCHEMA IF EXISTS joe CASCADE;1366openGauss=# 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 @@
30INSERT [/*+ plan_hint */] INTO30INSERT [/*+ 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 VALUES34 { 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```sql264```sql
256--创建表tpcds.reason_t2。265--创建表tpcds.reason_t2。
257openGauss=# CREATE TABLE tpcds.reason_t2266openGauss=# CREATE TABLE tpcds.reason_t2
@@ -411,3 +420,26 @@ UPDATE SET email = EXCLUDED.email;
411INSERT INTO users (id, email, name)420INSERT INTO users (id, email, name)
412VALUES (7, 'frank@example.com', 'Frank') ON CONFLICT (email text_pattern_ops) DO NOTHING;421VALUES (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 THEN24 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];
28NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!29NOTICE: '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,并插入数据
108openGauss=# CREATE TABLE products116openGauss=# CREATE TABLE products
109(117(
@@ -156,3 +164,57 @@ openGauss=# SELECT * FROM products ORDER BY product_id;
156openGauss=# DROP TABLE products;164openGauss=# DROP TABLE products;
157openGauss=# DROP TABLE newproducts;165openGauss=# 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 [, ...] ]
18REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ]18REPLACE [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ]
19+ [ OVERRIDING { SYSTEM | USER } VALUE ]
19 { DEFAULT VALUES20 { 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**
ywzq1161327784

【问题描述】 create_table.md insert.md replace_into.md 【修改建议】 这三个文件在lite版本也加上,保证lite版本和非lite保持一致,顺便改下冲突

likedislike
XXXCA
XXXCA
7月29日 评论:
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.
123openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT);132openGauss=# CREATE TABLE test (col1 int PRIMARY KEY, col2 INT);
124 133 
@@ -151,4 +160,20 @@ openGauss=# select * from test;
151 1 | 5160 1 | 5
152 2 | 6161 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+```