更新时间:2024-05-31 GMT+08:00
分享

DML

序号

概述

详细语法说明

差异

1

DELETE支持从多个表中删除数据

DELETE

-

2

DELETE支持ORDER BY和LIMIT

DELETE

-

3

DELETE支持从指定分区(或子分区)删除数据

DELETE

-

4

UPDATE支持从多个表中更新数据

UPDATE

-

5

UPDATE支持ORDER BY和LIMIT

UPDATE

-

6

SELECT INTO语法兼容

SELECT

  • GaussDB可以使用SELECT INTO根据查询结果创建一个新表,MySQL不支持。
  • GaussDB的SELECT INTO语法不支持将多个查询进行集合运算后的结果作为查询结果。

7

REPLACE INTO语法兼容

REPLACE

  • 时间类型初始值的差异。例如:
    • MySQL不受严格模式和宽松模式的影响,可向表中插入时间0值,即:
      mysql> CREATE TABLE test(f1 TIMESTAMP NOT NULL, f2 DATETIME NOT NULL, f3 DATE NOT NULL);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> REPLACE INTO test VALUES(f1, f2, f3);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> SELECT * FROM test;
      +---------------------+---------------------+------------+
      | f1                  | f2                  | f3         |
      +---------------------+---------------------+------------+
      | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 |
      +---------------------+---------------------+------------+
      1 row in set (0.00 sec)
    • GaussDB在宽松模式下才可以成功插入时间0值,即
      gaussdb=# SET b_format_version = '5.7';
      SET
      gaussdb=# SET b_format_dev_version = 's1';
      SET
      gaussdb=# SET sql_mode = '';
      SET
      gaussdb=# CREATE TABLE test(f1 TIMESTAMP NOT NULL, f2 DATETIME NOT NULL, f3 DATE NOT NULL);
      CREATE TABLE
      gaussdb=# REPLACE INTO test VALUES(f1, f2, f3);
      REPLACE 0 1
      gaussdb=# SELECT * FROM test;
      f1          |         f2          |     f3
      ---------------------+---------------------+------------
      0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00
      (1 row)

      在严格模式下,则报错date/time field value out of range: "0000-00-00 00:00:00"。

  • 位串类型初始值的差异。例如:
    • MySQLBIT类型的初始值为空串'',长度为(M/8向上取整),即:
      mysql> CREATE TABLE test(f1 BIT(3) NOT NULL);
      Query OK, 0 rows affected (0.01 sec)
      
      mysql> REPLACE INTO test VALUES(f1);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> SELECT f1, length(f1) FROM test;
      +----+------------+
      | f1 | length(f1) |
      +----+------------+
      |    |          1 |
      +----+------------+
      1 row in set (0.00 sec)
    • GaussDB的BIT类型的初始值为空串'',长度为0,则报错。
      gaussdb=# CREATE TABLE test(f1 BIT(3) NOT NULL);
      CREATE TABLE
      gaussdb=# REPLACE INTO test VALUES(f1);
      REPLACE 0 1
      gaussdb=# 
      SELECT f1, length(f1) FROM test;
      +----+------------+
      | f1 | length(f1) |
      +----+------------+
      |    |          0 |
      +----+------------+
      (1 row)

8

SELECT支持指定多分区查询

SELECT

-

9

UPDATE支持指定多分区更新

UPDATE

-

10

LOAD DATA导入数据功能

LOAD DATA

在使用LOAD DATA导入数据功能时,GaussDB与MySQL相比有如下差异:

  • LOAD DATA语法执行结果与M*严格模式一致,宽松模式暂未适配。
  • IGNORE与LOCAL参数功能仅为当导入数据与表中数据存在冲突时,忽略当前冲突行数据功能和当文件中字段数小于指定表中列数时自动为其余列填充默认值功能,其余功能暂未适配。
  • 指定LOCAL关键字,且文件路径为相对路径时,文件从二进制目录下搜索;不指定LOCAL关键字,且文件路径为相对路径时,文件从数据目录下搜索。
  • 语法中指定分隔符,转义字符,分行符等符号时,若指定为单引号,将导致词法解析错误。
  • [(col_name_or_user_var [, col_name_or_user_var] ...)]指定列参数不支持重复指定列。
  • [FIELDS TERMINATED BY 'string']指定换行符不能与[LINES TERMINATED BY 'string']分隔符相同。
  • 执行LOAD DATA语法写入表中的数据若无法转换为表中数据类型格式时报错。
  • LOAD DATA SET表达式中不支持指定列名计算。
  • 若set表达式返回值类型与对应列类型之间不存在隐式转换函数则报错。
  • LOAD DATA只能用于表,不能用于视图。
  • Windows下的文件与Linux环境下文件默认换行符存在差异,LOAD DATA无法识别此场景会报错,建议用户导入时检查导入文件行结尾的换行符。

11

INSERT支持VALUES引用列语法

INSERT INTO tabname VALUES(1,2,3) ON DUPLICATE KEY UPDATE b = VALUES(column_name)

GaussDB 的ON DUPLICATE KEY UPDATE子句中的VALUES()不支持表名.列名格式,MySQL支持。

12

LIMIT限制差异

DELETE、SELECT、UPDATE

各个语句的limit子项与MySQL的limit项当前存在差异。

GaussDB中limit参数最大值为BIG INT类型限制(超过9223372036854775807报错)。在MySQL中,limit最大值为unsigned LONGLONG类型限制(超过18446744073709551615 报错)。

limit可以设置小数值,实际执行时四舍五入。MySQL不能取小数。

GaussDB的delete语句中,不允许limit 0。MySQL在delete语句中允许limit 0。

13

反斜杠(\)用法差异

INSERT

反斜杠(\)的用法在GaussDB和MySQL中都可以由参数控制但当前默认用法不同:

MySQL中使用参数NO_BACKSLASH_ESCAPES控制字符串和标识符中的反斜杠(\)被解析为普通字符还是转义字符,默认反斜杠字符(\)作为字符串和标识符中的转义字符。设置set sql_mode='NO_BACKSLASH_ESCAPES';可以禁用反斜杠字符(\)作为字符串和标识符中的转义字符。

GaussDB中使用参数standard_conforming_strings控制字符串和标识符中的反斜杠 \ 被解析为普通字符还是转义字符。默认值为on,在普通字符串文本中按照SQL标准把反斜扛(\)当普通文本。使用set standard_conforming_strings=off;将反斜杠字符(\)作为字符串和标识符中的转义字符。

14

插入值少于字段数目时,MySQL报错,GaussDB补充空值。

INSERT

GaussDB不指定列的列表时,如果插入值少于字段数目,默认按建表时的字段顺序赋值。字段上有非空约束时报错,没有非空约束时,如果指定了默认值则缺省部分补充默认值,若未指定默认值则补充空。

15

ORDER BY中排序的列必须包括在结果集的列中。

SELECT

在GaussDB中,在与GROUP BY子句一起使用的情况下,ORDER BY中排序的列必须包括在SELECT语句所检索的结果集的列中。在与DISTINCT关键字一起使用的情况下,ORDER BY中排序的列必须包括在SELECT语句所检索的结果集的列中。

16

不允许对约束字段用 ON DUPLICATE KEY UPDATE 进行修改。

INSERT

-

17

SELECT结果允许存在重复列名。

SELECT

-

18

NATURAL JOIN与MySQL有差异。

SELECT

在GaussDB中,NATURAL [ [LEFT | RIGHT] OUTER] JOIN允许不指定LEFT | RIGHT,不指定时NATURAL OUTER JOIN为NATURAL JOIN。允许连续使用多次JOIN。

19

外键数据类型是timestamp/datetime时,update/delete外表报错。

UPDATE/DELETE

外键数据类型是timestamp/datetime时,update/delete外表报错,MySQL成功。

20

nature join和using兼容。

SELECT

  • GaussDB join的顺序严格按照从左往右,MySQL可能会调整顺序。
  • GaussDB和MySQL在natural join与using时均不允许左表或右表参与join的字段出现歧义(一般由左或右临时表中重名字段造成)。因为两者join的顺序有差别,故行为上可能有差别。
    • GaussDB的行为:
      m_regression=# CREATE TABLE t1(a int,b int);
      CREATE TABLE
      m_regression=# CREATE TABLE t2(a int,b int);
      CREATE TABLE
      m_regression=# CREATE TABLE t3(a int,b int);
      CREATE TABLE
      m_regression=# SELECT * FROM t1 JOIN t2;
       a | b | a | b 
      ---+---+---+---
      (0 rows)
      m_regression=# SELECT * FROM t1 JOIN t2 natural join t3; -- failed, 因为:列a,b在t1 join t2 得到的临时表中存在重复,故nature join存在歧义。
      ERROR:  common column name "a" appears more than once in left table
    • MySQL的行为:
      mysql> SELECT * FROM t1 JOIN t2 NATURAL JOIN t3;
      Empty set (0.00 sec)
      mysql> SELECT * FROM (t1 join t2) NATURAL JOIN t3;
      ERROR 1052 (23000): Column 'a' in from clause is ambiguous

21

with clause兼容MySQL8.0版本

SELECT 、INSERT、UPDATE、DELETE

-

22

join兼容

SELECT

GaussDB join不支持使用逗号“,”的连接方式,MySQL支持。

GaussDB不支持use index for join。

23

SELECT语句中列表达式为函数表达式、算数表达式等情形时,查询结果显示的列名为 ?column?

SELECT

GaussDB SELECT语句中列表达式为函数表达式、算数表达式等情形时,查询结果显示的列名为 ?column?,MySQL为对应表达式。

24

SELECT导出文件(into outfile)

SELECT ... INTO OUFILE ...

SELECT INTO OUTFILE语法,导出文件中FLOAT、DOUBLE、REAL类型的值显示精度和MySQL存在差异,不影响COPY导入和导入后的值。

25

UPDATE/INSERT/REPLACE ... SET指定模式名、表名

UPDATE/INSERT/REPLACE ... SET

UPDATE/REPLACE SET中,MySQL的三段式用法为database.table.column;GaussDB的三段式用法为table.column.filed,其中filed为指定复合类型中的属性。二者存在差异。

INSERT ... SET中,MySQL支持使用column、table.column和database.table.column;GaussDB只支持使用column,不支持使用table.column和database.table.column,二者存在差异。

26

UPDATE SET执行顺序与MySQL不同

UPDATE ... SET

MySQL中,UPDATE SET的顺序是从前往后依次UPDATE,前面UPDATE的结果会影响后面的结果,且允许多次设置同一列;GaussDB中为先取出原来的所有相关的数据,再一次性UPDATE,且不允许多次设置同一列,二者存在差异。

27

IGNORE特性

INSERT

MySQL数据库和GaussDB执行过程的差异,因此产生的WARNING条数和WARNING信息可能存在不同。

28

HAVING语法

SELECT

GaussDB的HAVING必须仅引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL支持对此行为的扩展,并允许HAVING引用列表中的SELECT列和外部子查询中的列。

分享:

    相关文档

    相关产品