問題描述
開發同事反饋在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)主鍵值不能被重用
提示:雖然并不總是需要主鍵,但是多數數據庫設計者都會保證他們創建的每個表具有一個主鍵,以便以后的數據庫的操作和管理。