Navicat for Oracle设置唯一性和递增序列
[数据库] Navicat for Oracle基本用法图文介绍
一. 设置唯一性
参考文章:Oracle之唯一性约束(UNIQUE Constraint)用法详解
唯一性约束英文是Unique Constraint,它是指表中一个字段或者多个字段联合起来能够唯一标识一条记录的约束。联合字段中,可以包含空值。
那唯一性约束与主键又有什么区别呢?
你可能会疑惑主键(Primary Key)不是唯一标识一张表的吗?
主键是所有组成主键的列都不能包含空值,而如果唯一性约束由多列组成,其中的部分列可以包含空值。同时,注意Oracle中不容许在相同列上既创建主键又创建唯一性约束。
例如学生表Student(id, stu_id, stu_name, sex, email, year),其中主键是学生学号(stu_id, year),假设该表学生每年都需要录入一遍数据,所以两个字段构成主键。
同时为了方便遍历,序号id也需要设置不同,这时候就需要id设置为唯一性。
唯一性约束可以在创建表时或使用ALTER TABLE语句创建。
创建唯一性约束的SQL语句如下:
- ALTER TABLE table_name
- ADD CONSTRAINT constraint_name
- UNIQUE (column1, column2, ... , column_n);
删除唯一性约束的SQL语句如下:
- ALTER TABLE table_name
- DROP CONSTRAINT constraint_name;
使用Navicat for Orcale方法如下:
两种方法均可设置唯一性约束:
alter table T_USER_INFO add constraint u_id unique(ID);
alter table T_USER_INFO add unique(ID);
此时查看表T_USER_INFO结构如下所示,其中用户名为主键:
同样查看唯一性可以看到刚设置的序号ID:
当修改表T_USER_INFO中ID字段,出现相同值或插入数据ID已经存在的时候,会报错:
二. 设置递增序列
前面讲述的插入序号ID,但是数据库中序号肯定会很多,如何在插入ID数据过程中更方便避免重复的插入呢?这就涉及到了设置ID为递增序列的方法。
Navicat for Orcale不像MySQL只需要勾选递增序列即可,它需要SQL语句来设置。所以这部分内容也非常重要,希望对你有所帮助。
主要步骤包括:
1) 设置序列
2) 设置对应序列和表的触发器
3) 插入数据时使用对应的触发器
具体方法如下:
第一部分 设置序列
1.通过点击"其他=》序列"可以操作序列:
2.点击进去后可以设计序列、新建序列、删除序列。
3.同样可以通过代码增加序列,对应上面的表T_USER_INFO用户表。
序列参数详见:oracle中创建序列以及序列使用注意事项
- CREATE SEQUENCE User_Info_SEQ
- minvalue 1
- maxvalue 9999999999999999999
- increment by 1
- start with 1;
4.点击新建的序列User_Info_SEQ后可以发现具体的序列:
第二部分 设置触发器
5. 然后设置对应表T_USER_INFO中字段ID的触发器,实现在向表中插入数据前自动插入自增长的序列。
- CREATE OR REPLACE TRIGGER Trigger_User
- BEFORE INSERT ON T_USER_INFO
- for each row
- when(NEW.ID is NULL)
- begin
- select User_Info_Seq.Nextval into :NEW.ID from dual;
- end;
创建成功如下图所示,注意不能缺少when(NEW.ID is NULL),因为在插入数据时会缺省ID这个值,让触发器自动补充。
6.查看表T_USER_INFO结构可以查看对应的触发器:
但有可能会报编译错误[Err] ORA-24344: success with compilation error。其原因是表的所有列名都需要大写,也可以手动添加“更新栏位”,否则如图虽然有增加触发器,但是更新栏位为空,所以这个插入是不成功的,插入时也不会触发主键的序列。
第三部分 插入数据
7.插入数据
- insert into T_USER_INFO
- (USERNAME,PWD,STATUS,DW_NAME,DW_CODE)
- values('eastmount','000000','2','软件学院','08111003');
此时能插入数据,其中字段ID会自动添加。
如果报错[Err] ORA-00001: unique constraint (GUICAI.SYS_C0017014) violated,如下图所示。这可能是因为表中设置了唯一性ID,出现重复数据的现象。如果不能设置唯一性约束且需要保持唯一性,推荐使用sys_guid()函数产生唯一编码。其实质想法是获取表中最大ID值再自动加1。
参考:[OARCLE]在Oracle中生成GUID类型--SYS_GUID()函数
test01(ID varchar2 32, NAME varchar2 20)
insert into "test01" values (sys_guid(),'张三');
如果报错:[Err] ORA-00001: unique constraint violated
它是因为在插入数据过程中ID出现重复数据违背了唯一性约束,可以修改ID值,或设置增大序列为最大值。即:start with 5000,但连续插入两次时就会成功插入。
最后我删除了唯一性约束,仅仅通过触发器插入递增序列,防止violated错误。
Navicat for Oracle设置唯一性和递增序列的更多相关文章
- Oracle 建表,递增序列,触发器,分析函数row_number() ,partition by 子句。
create table SC ( Id INTEGER, Name nvarchar2(20) , KC_Name nvarchar2(20), KC_score INTEGER , constra ...
- 在mysql Navicat中怎样设置ID自动递增
1.打开设计表 2.在添加或变更表结构时,把id字段设置为整型,下面的选项就会出现auto increment的选择框,勾选中就可以了.
- oracle设置自动增长序列
我们在用MS SQL Server时,可以为表的主键设置为自动加1的效果;但是在Oracle当中,我们是无法直接设置一个字段为自动加1,需要先建立一个Sequence,然后为这个表创建一个Trigge ...
- 【mysql】一对一关系的理解,以及Navicat Premium怎么设置字段的唯一性(UNIQUE)?
背景:一对一关系设计方法: 设计2张表:customer表,student表 学生表中通过字段customer_id与customer表产生关系. student表中的customer_id与cust ...
- Navicat for Oracle实现连接Oracle
不知道为什么,从一开始,我就不喜欢Oracle,名字好听,功能强大,但总感觉"高不可攀";或许是因为我觉得其他的数据库就可以解决数据问题,不太了解Oracle的优势:而且它长得也不 ...
- oracle数据库ID自增长--序列
什么是序列?在mysql中有一个主键自动增长的id,例如:uid number primary key auto_increment;在oracle中序列就是类似于主键自动增长,两者功能是一样的,只是 ...
- 使用Navicat连接Oracle数据时的一些问题,连接时错误:ORA-28547,新建用户后连接时错误:ORA-01017
发现Navicat作为一款连接数据库的工具确实很好用,可视化的界面看着舒服很多,下面说说我今天在连接Oracle数据库时的一些问题: 1.安装好Oracle后直接用Navicat是连接不上的,会出现如 ...
- mac版本navicat连接oracle报错ORA-21561
最近电脑更换成mac,很多软件都和win不一样了,正在慢慢适应,连接oracle原来用的客户端是pl/sql develop,蛋疼的是没有了mac版本, 用了navicat,具体设置如下 1.新建连接 ...
- navicat 连接 oracle
环境:windows2008r2(x64) oracle 11.2.0.1 1.找到Oracle服务端的NetManager程序(一般在开始菜单->oracle->配置和移植工具)中,修改 ...
随机推荐
- 1.4 如何防止sql注入
如何防止sql注入 1.检查变量数据类型和格式 如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型: ...
- 采用DCT进行图像压缩
一.实验目的:熟悉变换编码的图像压缩方法 二.实验内容:以所给图像为例,采用dct进行图像压缩编码,通过改变模板矩阵中非零元素的个数,得到不同缩编码图像, 根据公式 ,编写程序计算原图像和dct变换后 ...
- Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)
内容简介 本文主要说明在Java8及以上版本中,使用stream().filter()来过滤一个List对象,查找符合条件的对象集合. List对象类(StudentInfo) public clas ...
- AtCoder Beginner Contest 121 题解
题目链接:https://atcoder.jp/contests/abc121 A White Cells 分析:题目数据规模很小,直接暴力修改都可以.或者可以推出公式. 代码: #include & ...
- 11gR2 ASM RAC + ASM RAC dataguard配置
1.环境说明 --primary端配置 Primary RAC Node1 Node2 Public IP 192.168.56.120 192.168.56.122 Private IP 10.0. ...
- JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- Sublime Text 3 多行游标
选中要修改的地方ctrl+D ,要跳过不需要修改的选中的就用ctrl+k+d 选中要修改的地方ctrl+D,选中所有要修改的 alt+f3 ctrl+A ,然后ctrl+shift+L 按住shif ...
- P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- Linux--2 Linux之文档与目录结构、shell基本命令
一.Linux之文档与目录结构 1.Linux之文档与目录结构 Linux目录结构的组织形式和Windows有很大的不同.Linux没有“盘(如C盘.D盘.E盘)”的概念,而是建立一个根"/ ...
- 【手撸一个ORM】第十步、数据操作工具类 MyDb
说明 其实就是数据库操作的一些封装,很久不用SqlCommand操作数据库了,看了点园子里的文章就直接上手写了,功能上没问题,但写法上是否完美高效无法保证,建议有需要的朋友自己重写,当然如果能把最佳实 ...