解决primaryIndex里不显示主键索引的问题



自己创建的主键在表的primaryIndex里不显示,虽然可以手写进去,但是实际上是无效的。

后记,往excle里导出数据的时候会显示主键索引不存在的错误。

解决方法如下:

1. The index needs to be unique ('AllowDuplicates' property set to No)

2. The index needs to have 'AlternateKey' property set to Yes

3. The primary index of interest can only have one field in it

4. The field on the table used in the primary key needs to be mandatory

5. The field on the table used in the primary key cannot be editable

详细的参考下面文章。

http://daxdude.blogspot.jp/2012/07/primary-key-index-not-showing-up-in-ax.html

<think> 首先,用户的问题是:“添加主键索引,为什么这个出来显示索引是PRIMARY”。这似乎是针对数据库操作的一个具体问题,可能是在添加主键后,索引显示是预期的“PRIMARY”。 回顾之前的对话: - 用户第一次问“为表字段添加索引”,我提供了完整的指南,包括添加索引的SQL操作。 - 然后用户问“添加主键索引”,我又提供了添加主键索引的指南。 - 现在用户问“为什么这个出来显示索引是PRIMARY”,这表明用户在操作中遇到了具体问题:添加主键后,索引显示是“PRIMARY”。 因此,我需要解释为什么在添加主键索引时,显示索引名可能是“PRIMARY”。这是一个具体的疑问,我需要基于数据库知识回答。 关键点: - 在达梦数据库(基于之前的上下文)或其他数据库中,当你添加主键时,系统会自动创建一个索引。这个索引的名称通常是固定的“PRIMARY”;它可能由系统生成一个默认名称。 - 例如,在MySQL中,主键索引的默认名称通常是“PRIMARY”,但在其他数据库如Oracle或达梦中,它可能以其他方式命名。 回答结构: 1. 解释原因:主键索引的名称通常是系统自动生成的,是硬编码为“PRIMARY”。 2. 提供示例:在同的数据库中,索引名如何显示。 3. 如何查看管理索引名。 4. 如果需要,如何指定自定义名称(但主键索引通常能自定义名称)。 5. 结束部分必须包括“§§相关问题§§”3-5个相关问题。 确保回答完整: - 先用中文解释问题。 - 保持专业性清晰度。 - 结尾必须有“§§相关问题§§”一行,然后是3-5个相关问题编号。 相关问题: - 基于用户的问题我的回答,提出相关问题。 - 例如: 1. 如何自定义主键索引的名称? 2. 在达梦数据库中,主键索引的默认命名规则是什么? 3. 为什么主键索引能直接重命名? 4. 如何查看数据库中的所有索引名称? 5. 索引名称对数据库性能有影响吗? 现在构建回答: - 开头:直接回应问题。 - 主体:解释原因,提供SQL示例(如达梦数据库)。 - 结尾:相关问题。 完整回答: ### 添加主键索引索引是PRIMARY的原因 在达梦数据库中,当您添加主键约束时,系统会自动创建一个索引来支持该约束。这个索引的名称通常是固定的“PRIMARY”,而是由系统自动生成的名称,格式如“PK_XXX”(其中XXX是表名或随机字符)。这与MySQL的命名约定同(MySQL默认使用“PRIMARY”),但在Oracle、SQL Server等数据库中也有类似行为。 #### 原因分析: 1. **系统默认命名规则**: - 数据库引擎使用内部算法生成索引名(例如:PK_TABLENAME_随机后缀) - 目的是避免命名冲突,尤其在多用户环境中 2. **与MySQL的区别**: - MySQL为每个表的主键索引保留“PRIMARY”作为固定名称 - 达梦数据库则采用更通用的命名方式 3. **查看索引名称**: ```sql -- 查看表的索引信息(达梦数据库) SELECT index_name, table_name, uniqueness FROM user_indexes WHERE table_name = 'EMPLOYEES'; -- 替换为您的表名 ``` - 结果中主键索引的index_name类似“SYS_C0012345” #### 命名可自定义的原因: - 主键索引是约束的一部分,索引名次要于约束名 - 数据库内部处理时通过约束名而非索引名识别主键 - 修改索引名可能导致系统元数据一致 #### 最佳实践: - 使用约束名而非索引名引用主键: ```sql -- 通过约束名删除主键 ALTER TABLE employees DROP CONSTRAINT PK_employees; ``` - 接受自动命名,除非有特殊需求需手动重建索引 §§相关问题§§ 1. 在达梦数据库中如何修改主键约束的名称? 2. 主键索引普通索引在系统视图中的存储方式有何区别? 3. 为什么MySQL允许主键索引名为PRIMARY而达梦数据库行? 4. 如何通过索引名称判断索引类型(主键/唯一/普通)? 5. 重建主键索引是否会改变其名称?如何操作? </think> ### 添加主键索引索引是PRIMARY的原因及解决方法 在达梦数据库或其他数据库中,添加主键索引显示索引名通常是固定的"PRIMARY",而是由系统自动生成的名称(如"SYS_C0012345")。以下是详细解释操作指南: #### 核心原因 1. **系统自动命名规则**: - 数据库默认为主键约束生成唯一名称(格式:前缀+数字,如`PK_EMPLOYEES_123`或`SYS_C005678`) - 名称基于内部对象ID,避免命名冲突 2. **与MySQL的区别**: - MySQL中主键索引固定显示为"PRIMARY"(特殊保留名) - 达梦/Oracle等数据库强制使用特定名称 3. **索引与约束分离**: - 主键是"约束"(Constraint),索引是支持约束的"物理结构" - 系统优先显示约束名而非索引名 #### 验证与查看方法 ```sql -- 查看主键约束名称(非索引名) SELECT constraint_name, constraint_type FROM user_constraints WHERE table_name = 'EMPLOYEES' AND constraint_type = 'P'; -- P表示主键 -- 查看实际索引名称(可能同) SELECT index_name, index_type, table_name FROM user_indexes WHERE table_name = 'EMPLOYEES' AND uniqueness = 'UNIQUE'; ``` - 示例输出: ``` CONSTRAINT_NAME | INDEX_NAME --------------- | ---------- PK_EMP_ID | SYS_C0012345 -- 索引名自动生成 ``` #### 强制命名为PRIMARY的方法 达梦数据库支持直接命名主键索引为"PRIMARY",但可通过重建约束实现近似效果: ```sql -- 步骤1:删除原主键(谨慎操作) ALTER TABLE employees DROP PRIMARY KEY; -- 步骤2:添加自定义名称的主键约束(但索引名仍自动生成) ALTER TABLE employees ADD CONSTRAINT PRIMARY_KEY_MAIN PRIMARY KEY (emp_id); -- 验证名称 SELECT constraint_name FROM user_constraints WHERE table_name = 'EMPLOYEES'; -- 输出:PRIMARY_KEY_MAIN (索引名可能仍是SYS_XXX) ``` #### 注意事项 1. **命名可控性**: - 索引名由系统管理,用户只能影响约束名 - 即使约束名含"PRIMARY",索引名仍为系统生成 2. **性能无影响**: - 索引影响查询性能(引擎通过约束名识别) 3. **特殊情况**: - 唯一例外:在MySQL中`SHOW INDEX`会直接显示"PRIMARY"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值