表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义PRIMARY KEY
约束来创建主键。一个表只能有一个PRIMARY KEY
约束,而且PRIMARY KEY
约束中的列不能接受空值。由于PRIMARY KEY
约束确保唯一数据,所以经常用来定义标识列。
主键的一个目的就是确定数据的唯一性,它跟唯一约束的区别就是,唯一约束可以有一个NULL
值,但是主键不能有NULL
值,并且有以下的作用:
虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。
建表时候必须在create table语句中指定主键,如果建表不指定主键的话,Hubble数据库在建表时候自带rowid默认作为主键。
给一个字段建立主键,客户号cust_no唯一
create table cust_info(
cust_no string primary key,
cust_name varchar(30) not null,
cust_card_no varchar(18),
cust_phoneno DECIMAL(15)
);
多个字段建立复合主键,通过身份证号和姓名联合保证数据唯一,这是由于实际数据中姓名可以重复,但姓名与身份证的组合不会重复,能确定唯一值。
create table cust_info_bak(
cust_name varchar(30) not null,
cust_card_no varchar(18),
cust_phoneno DECIMAL(15),
primary key(cust_card_no,cust_name)
);
主键可以进行更改,但是在被更改的主键字段,必须在create table时候有not null进行约定,如果选用新增的字段作为主键,必须强调增加的字段语句要有not null,否则会导致主键更改失败。
CREATE TABLE cust_user (
cust_id STRING PRIMARY KEY,
cust_no varchar(20) ,
cust_email STRING ,
cust_name STRING,
cust_addr STRING,
cust_en STRING
);
show columns from cust_user;
column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden
--------------+-------------+-------------+----------------+-----------------------+-----------+------------
cust_id | STRING | false | NULL | | {primary} | false
cust_no | VARCHAR(20) | false | NULL | | {} | false
cust_email | STRING | true | NULL | | {} | false
cust_name | STRING | true | NULL | | {} | false
cust_addr | STRING | true | NULL | | {} | false
cust_en | STRING | true | NULL | | {} | false
cust_tel | STRING | false | NULL | | {} | false
ALTER TABLE cust_user ALTER COLUMN cust_no SET NOT NULL;
ALTER TABLE cust_user ALTER PRIMARY KEY USING COLUMNS (cust_no);
ALTER TABLE cust_user ADD COLUMN cust_tel string NOT NULL;
ALTER TABLE cust_user ALTER PRIMARY KEY USING COLUMNS (cust_tel);
show columns from cust_user;
column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden
--------------+-------------+-------------+----------------+-----------------------+---------------------------------+------------
cust_id | STRING | false | NULL | | {cust_user_cust_id_key} | false
cust_no | VARCHAR(20) | false | NULL | | {} | false
cust_email | STRING | true | NULL | | {} | false
cust_name | STRING | true | NULL | | {} | false
cust_addr | STRING | true | NULL | | {} | false
cust_en | STRING | true | NULL | | {} | false
cust_tel | STRING | false | NULL | | {cust_user_cust_id_key,primary} | false