云数据库GaussDB主键
云数据库GaussDB主键
GaussDB数据库涉及到主键的编程规范
INSERT
INSERT ON DUPLICATE KEY UPDATE不支持对主键或唯一约束的列上执行UPDATE。
INSERT ON DUPLICATE KEY UPDATE的语义是对唯一约束冲突的行进行更新,这个过程中不应对约束的值进行更新。
INSERT ON DUPLICATE KEY UPDATE如果插入多条数据,这些数据之间不允许存在主键/唯一约束冲突。
与MySQL行为存在一定差异,MYSQL允许此行为,例如如下语句:
INSERT INTO t1 VALUES(1, 1), (1, 2) ON DUPLICATE KEY UPDATE col2 = VALUES(col2);
不符合SQL标准,SQL标准不允许在同一条SQL COMMAND中,对插入行同时进行修改,使得结果无可预期。
例如上例中,假设col1为主键,那么此时会在同一个COMMAND中,既插入一条主键为1的,同时对已插入进行修改。由于事务串行化无法确认哪一个操作先执行,因此可能导致结果不稳定。
如果插入的数据本身存在冲突,在分布式场景下更新应以哪一条记录为准难以确定。
禁止对存在多个唯一约束的表执行INSERT ON DUPLICATE KEY UPDATE。
说明:表中存在多个唯一约束包括存在多个唯一索引,或既存在主键(PRIMARY KEY),又存在唯一索引(UNQUE INDEX)两种情况。
当存在多个唯一约束时,会默认检查所有的唯一约束条件,只要任何一个约束存在冲突,就会对冲突行进行更新,即可能更新多条记录,与业务预期不相符。业务应给予更加明确的插入更新条件。
对于批量插入的情况,建议使用INSERT INTO TABLE1 VALUES (),(),(),执行效率将高于执行多条INSERT INTO VALUES()
说明:由于目前无法识别多个值是否属于一个shard,所以要使用/*+ multinode */ 来允许此语句执行。
无论单条和多条插入,关键字均需是VALUES。
不支持MySQL的INSERT INTO mytable VALUE()的用法。
CREATE TABLE
功能描述
在当前数据库中创建一个新的空白表,该表由命令执行者所有。
注意事项
列存表支持的数据类型请参考列存表支持的数据类型。
列存表不支持数组。
列存表不支持生成列。
列存表不支持创建全局临时表。
创建列存表的数量建议不超过1000个。
如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。
列存表的表级约束只支持PARTIAL CLUSTER KEY、UNIQUE、PRIAMRY KEY,不支持外键等表级约束。
列存表的字段约束只支持NULL、NOT NULL和DEFAULT常量值、UNIQUE和PRIMARY KEY。
列存表支持delta表,受参数enable_delta_store控制是否开启,受参数deltarow_threshold控制进入delta表的阀值。
使用JDBC时,支持通过PrepareStatement对DEFAULT值进行参数化设置。
被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建表。如果想要创建包含serial类型列的表,还需要授予CREATE ANY SEQUENCE创建序列的权限。
开放能力
活动对象:华为云电销客户及渠道伙伴客户可参与消费满送活动,其他客户参与前请咨询客户经理
活动时间: 2020年8月12日-2020年9月11日
活动期间,华为云用户通过活动页面购买云服务,或使用上云礼包优惠券在华为云官网新购云服务,累计新购实付付费金额达到一定额度,可兑换相应的实物礼品。活动优惠券可在本活动页面中“上云礼包”等方式获取,在华为云官网直接购买(未使用年中云钜惠活动优惠券)或参与其他活动的订单付费金额不计入统计范围内;
-
开发指南
服务介绍、开发准备、使用场景等
-
API参考
实例管理、备份管理、任务管理、标签管理、磁盘管理等
-
SDK
基于华为云SDK,通过编码调用华为云API,访问华为云资源和数据
-
示例代码
数据库实例创建、查询、删除、用户授权、备份、SQL调优等