云数据库GaussDB主键

云数据库GaussDB主键

  • 什么是主键?

    数据库 主键 ,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的 实体完整性 。

    主键是被挑选出来,作表的行的唯一标识的候选关键字。主键可以由一个字段,也可以由多个字段组成,还可以由多个关键字共同组成,并且主关键字的列不能包含空值,分别称为单字段主键或多字段主键。

  • 主键的作用?

    主键的作用有四个:

    1.可以保证实体的完整性;

    2.能够加快数据库的操作速度;

    3.在表中添加新记录时,会自动检查新记录的主键值,不允许该值与其他记录的主键值重复;

    4.自动按主键值的顺序显示表中的记录,但如果没有定义主键,则按输入记录的顺序显示表中的记录。

  • 主键及复合主键的设置

    (1)单一主键:只需要在字段类型后写上 PRIMARY_KEY即可;

    例:CREATE TABLE A.TABLE

    ( DT DATE PRIMARY KEY);


    (2)复合主键:于字段编写最下方设置约束 CONSTRAINT 约束名 PRIMARY KEY(主键名);

    例:CREATE TABLE A.TABLE

    ( DT DATE NOT NULL,

    NAME VARYING(255) NOT NULL,

    CONSTRAINT YUESHU PRIMARY KEY(DT,NAME)

    );

    ————————————————

    来源:CSDN博主「早安太阳」

  • GaussDB创建主键和删除主键?

    创建主键

    GAUSS200,oracle主键添加语句通常紧跟在建表语句之后,也可以直接嵌在列声明⾥创建,创建主键时会⾃动在该列上创建索引。


    ⽅法⼀、使⽤add constraint ⽅法添加主键约束

    alter table 表名 add constraint 主键名 primary key (列名1,列名2,...)


    ⽅法⼆、使⽤索引创建主键

    (和⽅法⼀没有区别,可以将⽅法⼀理解为省略了using index)

    alter table 表名 add constraint 主键名 primary key (列名1,列名2,...)

    using index [index_name];


    当省略using index后⾯的index_name时,创建主键的同时创建同名索引;当使⽤已有索引index_name创建主键时,注意索引列和主键列应

    该相同才能创建成功。


    ⽅法三、直接添加主键

    alter table 表名 add primary key (列名1,列名2,...) ;

    同样,创建主键的同时创建同名索引


    -⽅法四、参数列内添加主键

    create table ALERT_RESULT_EVENT_C

    (

    data_date VARCHAR2(8) not null,

    object_id VARCHAR2(600) not null,

    event_id VARCHAR2(20) not null,

    ratio NUMBER(22,4),

    pairing_object_id VARCHAR2(128),

    index_value_1 VARCHAR2(128),

    index_value_2 VARCHAR2(128),

    constraint PK_ALERT_RESULT_EVENT_C primary key (DATA_DATE, OBJECT_ID, EVENT_ID)

    );


    删除主键

    alter table 表名 drop primary key` ;

    采⽤该语句删除主键时,同名索引也会被删掉。

    alter table 表名 drop primary key keep index;

    该语句只删除主键,保留索引

    ————————————————

    来源:CSDN博主「还有两根头发」

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调优等