问题描述
开发同事反馈在vertica中创建含主键列的表中插入重复数据时没有进行校验,插入重复值成功。经过测试着实可以插入重复值,这个坑有些不一样。
创建表和插入语句如下:
--创建表
CREATE TABLE dhhtest(
ID VARCHAR(64) PRIMARY KEY
);
--插入语句 不报错
insert into dhhtest values('1');
insert into dhhtest values('1');
--查询 发现2条语句
select * from dhhtest;
分析过程
百度没有相关的博客,最后只好硬着头皮去
查表约束是否启用
is_enabled显示f 未启用
SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_
name IN ('dhhtest');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
C_PRIMARY | id | p | f
查看数据库参数
表可以指定 Vertica 是否自动强制执行主键、唯一键或使用关键字 ENABLED 或 DISABLED 检查约束。如果省略 ENABLED 或DISABLED,则 Vertica 通过检查相应的配置参数:
查看创建表和约束语法
--创建表中Table-Constraint语法
[ CONSTRAINT constraint-name ]
{
... PRIMARY KEY (column[,... ]) [ ENABLED | DISABLED ]
... | FOREIGN KEY (column[,... ] ) REFERENCES table [ (column[,...]) ]
... | UNIQUE (column[,...]) [ ENABLED | DISABLED ]
... | CHECK (expression) [ ENABLED | DISABLED ]
}
--创建约束语法
ALTER TABLE table_name ADD CONSTRAINT constraint-name PRIMARY KEY (column) ENABLED;
解决办法
解决办法1_更改数据库参数
#查主键约束默认不启用 默认值0 (false/disabled)
SELECT GET_CONFIG_PARAMETER('EnableNewPrimaryKeysByDefault');
#查唯一键约束默认不启用 默认值0 (false/disabled)
SELECT GET_CONFIG_PARAMETER('EnableNewUniqueKeysByDefault');
#主键约束默认不启用改为默认启用
SELECT SET_CONFIG_PARAMETER('EnableNewPrimaryKeysByDefault', 1);
#唯一键约束默认不启用改为默认启用
SELECT SET_CONFIG_PARAMETER('EnableNewUniqueKeysByDefault', 1);
解决办法2_更改SQL
方案1
CREATE TABLE dhhtest(
ID VARCHAR(64) PRIMARY KEY
);
ALTER TABLE public.dhhtest ADD CONSTRAINT pk_dhhtest PRIMARY KEY (ID) ENABLED;
方案2
CREATE TABLE dhhtest(
ID VARCHAR(64) PRIMARY KEY ENABLED
);
查看约束是否启用,t启用
SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_
name IN ('dhhtest');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
C_PRIMARY | id | p | t
补充下主键概念
- 概念
主关键字(主键,primary key)是被挑选出来,作表的行的惟一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。
- 作用:
1)保证实体的完整性;
2)加快数据库的操作速度
3)在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4) ACCESS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
- 特点:
1)一个表中只能有一个主键。如果在其他字段上建立主键,则原来的主键就会取消。在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键。
2)主键的值不可重复,也不可为空(NULL)。
3)主键值不能被重用
提示:虽然并不总是需要主键,但是多数数据库设计者都会保证他们创建的每个表具有一个主键,以便以后的数据库的操作和管理。