1.为啥使用约束条件:

约束条件也叫完整性约束条件,当对表中的数据做DML操作时会验证数据是否违反约束条件.如果违反了DML操作会失败.约束条件可以应用于表中的一列或几列,应用于整个表或几个表之间.

约束条件分类:非空(NOT NULL),唯一(UNIQUE),主键(PRIMARY KEY),外键(FOREIGN KEY),检查(CHECK).

其中NOT NULL只能应用于列.假如要应用于表的话那么那个表就没啥用处了,所以自然是不行.约束条件跟其他数据库对象一样会有名字,可由用户自定指定.如果没指定则系统默认生成.格式为SYS_cXXX.其中XXX代表一些随机数字.

2.创建约束条件语法:

1.在创建表时指定约束条件:

CREATE TABLE [schema.]table_name(

column_name datatype[DEFAULT expr] [column_constraint],[,...],

[table_constraint]

);

其中column_constraint = [CONSTRAINT constraint_name] constraint_tyep;

table_constraint =[CONSTRAINT constraint_name] constraint_tyep(column,...)];

2.表创建完之后再指定约束条件:

ALTER TABLE table_name ADD [CONSTRAINT constraint_name] constraint_type(column,...);

3.非空约束(NOT NULL):

建表时约束并指定名字:CREATE TABLE arwen(ename char(10),eno int CONSTRAINT arwen_eno_nn NOT NULL).

建表时约束不指定名字:CREATE TABLE arwen(ename char(10),eno int NOT NULL).

建表后约束:CREATE TABLE arwen(ename char(10),eno int );

ALTER TABLE arwen MODIFY(eno int NOT NULL). ---只有NOT NULL用MODIFY其他用ADD

创建约束后使用:

INSERT INTO arwen(ename) VALUES('good');会出错,提示无法插入NULL.

4.唯一约束(UNIQUE):

建表时约束并指定名字:CREATE TABLE arwen(ename char(10),eno int CONSTRAINT arwen_eno_uk UNIQUE)或者

CREATE TABLE arwen(eno int ,ename char(10),CONSTRAINT arwen_eno_uk UNIQUE(eno))

建表时约束不指定名字:CREATE TABLE arwen(ename char(10),eno int UNIQUE).

建表后约束:CREATE TABLE arwen(ename char(10),eno int );

ALTER TABLE arwen ADD UNIQUE(eno)或者

ALTER TABLE arwen ADD CONSTRAINT arwen_eno_unUNIQUE(eno);

创建约束后使用:

INSERT INTO arwen VALUES('good',12);连续执行两次,第二次会出错.

如果INSERT INTO arwen VALUES('good',NULL);无论重复多少次都不会出错

5.检查(CHECK):

建表时约束并指定名字:CREATE TABLE arwen(ename char(10),eno int ,CONSTRAINT arwen_eno_check CHECK(eno>10))

建表时约束不指定名字:CREATE TABLE arwen(ename char(10),eno int ,CHECK(eno>10))

建表后约束:CREATE TABLE arwen(ename char(10),eno int );

ALTER TABLE arwen ADD CHECK(eno>10)或者

ALTER TABLE arwen ADD CONSTRAINT arwen_eno_check CHECK(eno>10)

创建约束后使用:

INSERT INTO arwen VALUES('good',3);会出错.

如果INSERT INTO arwen VALUES('good',13);正确

6.主键(PRIMARY):

建表时约束并指定名字:CREATE TABLE arwen(ename char(10),eno int ,CONSTRAINT arwen_eno_pk PRIMARY KEY(eno))

建表时约束不指定名字:CREATE TABLE arwen(ename char(10),eno int PRIMARY KEY)

建表后约束:CREATE TABLE arwen(ename char(10),eno int );

ALTER TABLE arwen ADD PRIMARY KEY(eno)或者

ALTER TABLE arwen ADD CONSTRAINT arwen_eno_pk PRIMARY KEY(eno)

创建约束后使用:

INSERT INTO arwen VALUES('good',12);连续执行两次,第二次会出错.

如果INSERT INTO arwen VALUES('good',NULL);连续执行两次,第二次会出错.

7.外键(FOREIGN KEY):

假如有表arwen(ename,eno)和表info(eno,location).在表info中eno是主键.则在表arwen中eno为外键.当insert数据到arwen中时.eno值必须是表info中的eno值.这有点像其他编程语言中的枚举类型了.你只能用里面的某一个,不能用别的.不过此处不同的是还可以插入NULL到arwen中的eno列

注意:arwen中的eno同时也能为主键.即某一列可同时为主键和外键.

CREATE TABLE info(location char(10),eno int PRIMARY KEY);

建表时约束并指定名字:CREATE TABLE arwen(ename char(10),eno int ,CONSTRAINT arwen_eno_fkFOREIGN KEY(eno) REFERENCES(info(eno))

建表时约束不指定名字:CREATE TABLE arwen(ename char(10),eno int FOREIGN KEYREFERENCES(info(eno))

建表后约束:CREATE TABLE arwen(ename char(10),eno int );

ALTER TABLE arwen ADDFOREIGN KEY(eno) REFERENCES(info(eno))或者

ALTER TABLE arwen ADD CONSTRAINT arwen_eno_fk FOREIGN KEY(eno) REFERENCES(info(eno))

创建约束后使用:

INSERT INTOinfo VALUES('hunan',12);

INSERT INTO arwen VALUES('good',13);--此处会出错.如果把13改成12就正确.

补充:表arwen中的eno同时为主键和外键,则就这样建表.

CREATE TABLE arwen(ename char(10),eno int PRIMARY KEY,FOREIGN KEY(eno) REFERENCES(info(eno))

8.禁用和启用约束条件:

语法:

ALTER TABLE table_name

DISABLE | ENABLE CONSTRAINT constraint_name [CASCADE];

这里需要用到constraint_name如果你没有手动去命名,系统会默认生成,你需要去数据字典中查找才知道它是多少.

比如在查找表arwen上的约束条件:

SELECT constraint_name,constraint_type FROM user_constraints WHERE table_name = 'ARWEN';--记得加引号,而且arwen必须大写.

此处CASCADE用处:如果写上它的话表示你禁用主键约束也会同时禁用对应的外键约束,但重启主键约束时不会自动去重启外键约束,需单独去启动外键约束.

如果不写CASCADE.禁用主键约束时如果它有对应的外键约束则会出错.必须先删除或禁用对应的外键约束后才能再禁用主键约束.

9.修改,删除约束条件名称

假如你开始没给约束命名,在禁用和启动约束时又得去查数据字典,这多麻烦啊.这会你就后悔开始偷懒没命名了.不过幸好有改约束名字的方法,可以亡羊补牢啊.

语法:

ALTER TABLE table_name RENAME CONSTRAINT old_name TO new_name;

假如之前表arwen中某个约束条件系统生成的名字为SYS_C001234

想改成arwen_ename_pk

ALTER TABLE arwen RENAME CONSTRAINT SYS_C001234 TO arwen_ename_pk

语法:

ALTER TABLE table_name

DROP CONSTRAINT constraint_name [CASCADE];

例如:ALTER TABLE arwen DROP CONSTRAINT arwen_ename_pk;

如果是主键约束并且存在对应的外键约束.按上面的方法删除主键约束会出错.除非先删除外键约束.另外可以用如下方法.

例如:ALTER TABLE arwen DROP CONSTRAINT arwen_ename_pk CASCADE这样删除主键约束时把外键约束也同时删除了.

补充:不权是删除约束条件,删除表也是这样.如果存在外键约束.必须用CASCADE CONSTRAINT.

例如删除表arwen:

DROP TABLE arwen CASCADE CONSTRAINT;--删除表arwen的同时把其对应的外键约束也删除了

约束条件(constraint)相关推荐

  1. php单元测试断言方法

    1.assertArrayHasKey() 用法:$this->assertArrayHasKey('foo', ['bar' => 'baz']); 等同于array_key_exist ...

  2. java学习(4)--oracle

    1.约束条件  constraint 1)主键PK ① 主键约束 = 不能重复 + 不能为null ② 主键约束可以用两种方式定义:列级约束和表级约束 2) 非空约束 NN 非空约束只能定义在列级 3 ...

  3. PHPUnit-附录 A. 断言 (assert)

    [http://www.phpunit.cn/manual/5.7/zh_cn/appendixes.assertions.html] 本附录列举可用的各种断言方法. assertArrayHasKe ...

  4. java基础知识复习

    1.java语言是强类型还是弱类型语言?为什么? Java 是强类语言,在使用变量时有如下规则: ü      变量必须声明,并且初始化以后才能使用. ü      变量必须有明确的类型(type). ...

  5. OR-Tools工具介绍以及实战(从入门到超神Python版)

    目录 前言 0.安装 一.什么是优化问题? 1-1.优化问题介绍 1-2.举例 1-2-1.导入所需要的库 1-2-2.声明求解器 1-2-3.创建变量 1-2-4.定义约束条件 1-2-5.定义目标 ...

  6. (三)mysql_浅谈MySQL(三)

    //文章浅显,大神勿怪,欢迎讨论 //未完待续之前我们说到数据库像一个异世界的图书馆,我们是其中的管理员(对,就是那位man),管理着图书馆里的所有资源,如书架(Databases),里面装着书(Da ...

  7. [翻译] 数学翻译词汇

    初等数学   elementary mathematics 高等数学  higher mathematics 现代数学  modern mathematics 基础代数  basic mathemat ...

  8. 带约束的多目标优化进化算法综述

    约束优化进化算法综述 1.摘要 约束优化进化算法主要研究如何利用进化计算方法求解约束优化问题,是进化计算领城的一个重要研究课题.约束优化问题求解存在约束区域离散.等式约束.非线性约束等挑战,其问题的本 ...

  9. 使用Julia运用JuMP和Clp求解Lp和ILP问题(分支定界法)

    #张文硕编写-2022年运筹作业,西交的同学请勿抄袭,会查重 using JuMP using Clp #=导入Clp和JuMP,其中Clp为求解器,JuMP是一个类似于接口的东西=#model = ...

最新文章

  1. linux centos7 createrepo 创建本地 yum 仓库
  2. IOS 2D游戏开发框架 SpriteKit--续(postion,锚点,游戏滚动场景)
  3. MySQL数据库:完整性约束
  4. JAVA框架Struts2
  5. 图表达相关书书籍调研
  6. java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)...
  7. 8102年底如何开发和维护一个npm项目
  8. 双显卡单独分辨率_甜点光追显卡—带你实现GAMING梦!!!
  9. poj 1655 Balancing Act(求树的重心)
  10. ftp一句話download
  11. VMware中安装Ubuntu出现多个vmdk文件原因
  12. Linux设备驱动之udal341声卡驱动与madplay播放器移植
  13. pinia和vuex的区别
  14. 游戏创业团队的技术选型之Flash AIR
  15. 图像识别开源_看看开源图像识别技术
  16. 补交20145226蓝墨云班课 -- Arrays和String单元测试
  17. Unity3D 动态加载本地/网络GLB模型
  18. Citrix云桌面最小环境搭建
  19. 多元矩阵乘积的导数问题
  20. (转)架构师已死(转自UML软件工程组织)

热门文章

  1. java里Bundle是什么_OSGi 体系结构及Bundle简介
  2. 微信小程序运行机制介绍以及运行时可优化点
  3. C# 如何代码设置字体的FontFamily,引用特殊的字体资源
  4. 打印机脱机恢复正常打印的三种解决方法
  5. javascript异步中的回调
  6. js把时间转化刚刚、几秒前、几分种前、几小时前、几天前
  7. 【技术分享】PHP常用的数组函数
  8. Pycharm--激活码完美破解
  9. Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。
  10. (02)Cartographer源码无死角解析-(04) 熟悉bag文件,配置.launch与.lua文件,初步调参