达梦中组合主键创建的问题

最近在Oracle迁移到达梦中遇到一个组合主键的问题,Oracle中该表已经是组合主键的结构,在迁移的数据到达梦后建立组合主键时报错违反唯一性约束,接下来与大家一起分享下这个问题

构建Oracle中的创建测试表

 oracle中表结构的创建如下
 
 create table test01     
 (
 "ID" int not null,
 "NAME" VARCHAR(20) not null,
 primary key("ID","NAME")
 );
 
 插入两条测试数据
 insert into test01 values (1,'A');
 insert into test01 values (1,'A ');

在Oracle中以上是可以正常执行插入的,接下来使用达梦迁移工具迁移到达梦中

迁移表数据到达梦

使用达梦迁移工具进行迁移
在这里插入图片描述

可以看见在添加主键约束的时候失败了,查看具体的报错为违反唯一性约束

在这里插入图片描述

刚开始遇到这个问题的时候,怀疑是Oracle那边的数据有重复的,于是在Oracle端排查数据是否有重复的问题

select id,name,count(*) from test01 group by id,name having count(*) >1;

并没有发现有重复的数据,于是到达梦这边也使用这条语句进行查询,结果也是没有重复数据

接下来在达梦这边先用同样的语句创建好表结构,在进行迁移数据

先使用语句在达梦中创建好表结构,再迁移数据
 create table test01     
 (
 "ID" int not null,
 "NAME" VARCHAR(20) not null,
 primary key("ID","NAME")
 );

结果还是报错违反唯一性约束,后续仔细检查后发现,问题数据正如同我上面创建的测试数据一样,‘A’ 与 ‘A ’的差别

执行以下sql查询:
select trim(id),trim(name),count(*) from test01 group by trim(id),trim(name) having count(*) >1;

达梦与Oracle中的结果都是一样,证明迁移工具迁移数据时并没有做trim的处理,但在创建主键的时候,达梦中确报错了违反唯一性约束
在这里插入图片描述

将达梦中这条’A’ 与’A ’ 的数据中的一条进行删除后,再次创建主键,成功,问题就出在这两条数据中,第二个’A '中后面接了一个空格,导致达梦中的主键创建失败

<think>好的,我需要回答用户关于达梦数据库主键的使用方法和配置教程的问题。首先,我得回忆一下达梦数据库的基本知识,主键数据库中的作用是确保表中每一行数据的唯一性,通常用于快速检索和避免重复数据。 用户提到参考了站内引用[1],里面提到修改配置文件适配group by和大字段比较,以及开启日志备份。这些可能与主键配置没有直接关系,但可能涉及数据库的整体配置优化。不过主键的设置通常在表结构设计阶段完成,通过SQL语句实现,而不是通过修改配置文件。 接下来,我需要分步骤说明如何在达梦数据库创建主键主键可以通过CREATE TABLE时定义,或者ALTER TABLE添加。需要说明两种方法,并给出示例。同时,要考虑主键的约束,比如唯一性和非空,以及可能使用的聚簇索引。 用户可能还关心主键的配置参数,比如是否自动生成、使用序列等。达梦支持自增列,类似于其他数据库的AUTO_INCREMENT,这可以用于主键字段。此外,索引类型的选择,比如聚簇索引和非聚簇索引的区别,以及如何指定存储表空间,这些也是配置时需要注意的地方。 还需要提到主键的修改和删除方法,以及相关的注意事项,比如依赖约束的问题。可能用户在实际操作中会遇到需要调整主键的情况,这时候需要ALTER TABLE语句的使用。 最后,确保回答符合格式要求:使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不太涉及数学公式。不过如果有涉及索引性能分析的公式,可能需要使用LaTeX。但主键配置更多是SQL语法,所以可能不需要数学表达式。需要检查是否有必要的地方添加引用,比如提到日志备份时引用[^1]。 现在组织回答结构:先介绍主键的作用,然后分创建方法、配置参数、管理操作、注意事项,最后相关问题。确保每个步骤有代码示例,并说明相关参数配置,比如自增列和表空间设置。同时,在涉及配置文件修改或日志备份的地方,添加引用。</think>### 达梦数据库主键使用方法及配置教程 #### 一、主键的作用 主键(Primary Key)用于唯一标识表中的每一条记录,强制实现**实体完整性**,具有以下特性: - **唯一性**:主键值不可重复 - **非空性**:主键字段不允许为NULL - **最小性**:主键应是字段最简组合 #### 二、主键创建方法 ##### 1. 建表时定义主键 ```sql -- 单字段主键 CREATE TABLE employees ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50) ); -- 多字段联合主键 CREATE TABLE order_details ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) ); ``` ##### 2. 修改表添加主键 ```sql ALTER TABLE departments ADD CONSTRAINT pk_dept_id PRIMARY KEY(dept_id); ``` #### 三、主键配置参数 1. **自增主键** 达梦支持通过`IDENTITY`属性实现自增: ```sql CREATE TABLE users ( user_id INT IDENTITY(1,1) PRIMARY KEY, -- 从1开始,步长1 username VARCHAR(30) ); ``` 2. **聚簇索引** 默认主键自动创建聚簇索引,可显式指定: ```sql CREATE TABLE logs ( log_id INT PRIMARY KEY CLUSTERED, content TEXT ); ``` 3. **表空间指定** 通过`STORAGE`子句控制存储位置: ```sql CREATE TABLE transactions ( trans_id INT PRIMARY KEY, amount DECIMAL(10,2) ) STORAGE (ON "MAINSPACE"); ``` #### 四、主键管理操作 1. **查看主键信息** ```sql SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P'; ``` 2. **删除主键** ```sql ALTER TABLE employees DROP CONSTRAINT CONSTRAINT_NAME; ``` #### 五、注意事项 1. 主键字段建议选择**短且稳定**的字段 2. 使用自增主键时,注意`IDENTITY`缓存设置(通过`INI`参数`IDENTITY_CACHE_SIZE`调整) 3. 大表建议将主键索引与数据分离存储: ```sql CREATE CLUSTER INDEX idx_pk ON large_table(id) STORAGE(ON "INDEXSPACE"); ``` #### 六、配置文件适配 如引用所述,进行以下配置优化: 1. 修改`dm.ini`配置文件: ```ini ENABLE_FULLTEXT_INDEX = 1 -- 启用全文索引支持 MAX_STRING_LENGTH = 8188 -- 调整字段长度限制 ``` 2. 重启数据库服务使配置生效
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值