一。利用已有索引创建主键
1.建表
GAO@PROD> create table abcd(id number(10),name1 varchar2(20));

Table created.

2.插入数据
GAO@PROD> insert into abcd values(1,'genwang');

1 row created.

GAO@PROD> commit;

Commit complete.

3.给id字段创建索引
GAO@PROD> create index pk_abcd on abcd(id);

Index created.

4.利用已有索引创建主键
GAO@PROD> alter table abcd add constraint pk_abcd primary key(id);

Table altered.

5.查看表的索引和约束
GAO@PROD> select index_name from user_indexes where table_name=upper('abcd');

INDEX_NAME
------------------------------------------------------------------------------------------
PK_ABCD

GAO@PROD> select constraint_name from user_constraints where table_name=upper('abcd');

CONSTRAINT_NAME
------------------------------------------------------------------------------------------
PK_ABCD

6.删除主键
GAO@PROD> alter table abcd drop primary key;

Table altered.

7.查看索引和约束是否已经被删除,发现索引还在,约束没了
GAO@PROD> select index_name from user_indexes where table_name=upper('abcd');

INDEX_NAME
------------------------------------------------------------------------------------------
PK_ABCD

GAO@PROD> select constraint_name from user_constraints where table_name=upper('abcd');

no rows selected

8.用别的字段重建主键,发现报错 ORA-00955
alter table abcd add constraint pk_abcd primary key(id,name1);

GAO@PROD> alter table abcd add constraint pk_abcd primary key(id,name1);
alter table abcd add constraint pk_abcd primary key(id,name1)
*
ERROR at line 1:
ORA-00955: name is already used by an existing object

解决办法:
1)删除原来的索引,然后再创建新的主键
GAO@PROD> drop index pk_abcd;

Index dropped.

2)GAO@PROD> alter table abcd add constraint pk_abcd primary key(id,name1);

Table altered.

9.查看此时abcd表的索引和约束(可以看到如果该表主键列没有索引,这时创建主键时会自动在主键列创建索引)
GAO@PROD> select index_name,uniqueness from user_indexes where table_name=upper('abcd');

INDEX_NAME UNIQUENESS
------------------------------------------------------------------------------------------ ---------------------------
PK_ABCD UNIQUE

GAO@PROD> select constraint_name from user_constraints where table_name=upper('abcd');

CONSTRAINT_NAME
------------------------------------------------------------------------------------------
PK_ABCD

9.删除主键
GAO@PROD> alter table abcd drop primary key;

Table altered.

10.查看索引和约束状态(发现索引和约束都不复存在)
GAO@PROD> select index_name from user_indexes where table_name=upper('abcd');

no rows selected

GAO@PROD> select constraint_name from user_constraints where table_name=upper('abcd');

no rows selected

11.此时添加新的主键,不再报错
alter table abcd add constraint pk_abcd primary key(id,name1);

结论:如果主键是基于原来索引创建的,那么alter table XXX drop primary key只能删除约束,无法删除原来索引。如果此时创建主键时,主键列与索引列不同,那么就会报错ORA-00955: name is already used by an existing object。
如果主键创建时,主键列没有索引,那么创建主键时会自动在主键列创建唯一索引,这时alter table XXX drop primary key就会把约束和索引一起删除。重新创建主键时就不会报错。

删除主键时报错ORA-00955的更多相关文章

  1. SQL语句添加,删除主键

    IF EXISTS (SELECT * FROM sys.all_objects  WHERE  type_desc= N'主键名')begin --删除主键 alter table 表名 drop ...

  2. MySQL基础之 如何删除主键

    我们在一个表中设置了主键之后,那么如何删除主键呢? 删除主键的语法是: ALTER TABLE TABLE_NAME DROP PRIMARY KEY; 在这里我们要考虑两种情况: 1.可以直接使用d ...

  3. sql server 删除主键、外键、索引、约束的脚本

    最近公司项目要升级新版本,涉及到数据库升级中各种约束.亦是整理出如下脚本方便以后查询. --删除全文索引 DECLARE c0 cursor for SELECT'DROP FULLTEXT INDE ...

  4. Oracle删除主键约束的同时删除索引

    继续昨天的折腾(Oracle修改主键约束),删掉主键约束后,发现唯一索引并未删掉.仔细看了下,主键约束跟唯一索引名称不一样,这说明是先创建了唯一索引,后创建的主键约束.我们来试验下: SQL> ...

  5. 给表追加主键-----报错ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键

    由于 这次 项目 做了 数据库 迁移(从 mysql 转到oracle  用的是navicat) 的工具  所以导致很多主键都丢失了 导致数据库很多 数据的id重复  导致系统修改一条数据的时候 出现 ...

  6. PL/SQL 删除主键 ORA-02443: 无法删除约束条件-不存在的约束条件

    在PL/SQL developer中删除一个表的主键,然后把另外一个字段设置成主键,删除的过程中报错:ORA-02443 我遇到这个问题出现的背景是: alter table saleqtya dro ...

  7. sql server删除主键约束所想到的

    从网上找到了下面一段代码: declare @Pk varchar(100);select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('表 ...

  8. mysql 增加字段脚本,以及删除主键约束的脚本,存储过程

    //增加一个库下面所有表的row_id和其他9个字段的存过 DELIMITER $$ USE `erptest`$$ DROP PROCEDURE IF EXISTS `UPTABLE`$$ CREA ...

  9. sqlserver 2014 删除主键约束

    truncate table menu SELECT * FROM sys.foreign_keys WHERE referenced_object_id=OBJECT_ID('menu'); --找 ...

随机推荐

  1. springboot优雅的异常处理

    springboot全局异常处理 @ControllerAdvice 尽管springboot会对一些异常进行处理,不过对于开发者来说,这还不太便于维护,因此我们需要自己来对异常进行统一的捕获与处理. ...

  2. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  3. Junit单元测试&反射&注解

    内容索引 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关 ...

  4. CRM系统实施中如何避免“踩雷”

    CRM系统实施后,效果没有达到预期是很多企业出现的情况.而最主要的原因就是在实施之前没有足够的思考和相应的计划.那么,企业应如何避免CRM系统实施时"踩雷"?这里有几条建议希望可以 ...

  5. 『动善时』JMeter基础 — 18、JMeter配置元件【计数器】

    目录 1.计数器介绍 2.计数器界面详解 3.计数器的使用 (1)测试计划内包含的元件 (2)线程组界面内容 (3)计数器界面内容 (4)HTTP请求界面内容 (5)查看结果 1.计数器介绍 如果需要 ...

  6. Java并发-显式锁篇【可重入锁+读写锁】

    作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized: 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock.读写 ...

  7. VS·调试过程中某个操作导致调试突然退出之解决方案

    阅文时长 | 0.11分钟 字数统计 | 232字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·调试过程中某个操作导致调试突然退出之解决方案』 编写人 | SCscHero 编 ...

  8. 基于混合云模式的calico部署

    开始前准备 确定calico数据存储 Calico同时支持kubernetes api和etcd数据存储.官方给出的建议是在本地部署中使用K8S API,仅支持Kubernetes模式.而官方给出的e ...

  9. Linux_LVM管理

    一.Ivm的应用场景及其弊端 1.应用场景: 随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了 2.弊端: 数据不是直接存放在硬盘上,而是在硬盘的.上面又虚拟出来--层逻辑卷存放数据,故而增加 ...

  10. 源码安装Python3

    源码安装Python3 一.安装Python3需要的依赖包 [root@localhost ~]# yum install -y gcc make wget openssl openssl-devel ...