SQL中的CONSTRAINT(约束)⽤法
主要就是增加数据约束的。
ORACLE⽀持五种类型的完整性约束
NOT NULL (⾮空)–防⽌NULL值进⼊指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.
CHECK (检查)–检查在约束中指定的条件是否得到了满⾜.
UNIQUE (唯⼀)–保证在指定的列中没有重复值.在该表中每⼀个值或者每⼀组值都将是唯⼀的.
PRIMARY KEY (主键)–⽤来唯⼀的标识出表的每⼀⾏,并且防⽌出现NULL值,⼀个表只能有⼀个主键约束.
POREIGN KEY (外部键)–通过使⽤公共列在表之间建⽴⼀种⽗⼦(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯⼀键.
以下⼏种约束 、并 ⼀⼀列举:
1.主键约束:
要对⼀个列加主键约束的话,这列就必须要满⾜的条件就是分空
因为主键约束:就是对⼀个列进⾏了约束,约束为(⾮空、不重复)
以下是代码 要对⼀个列加主键,列名为id,表名为emp
格式为:
alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)
例⼦:
alter table emp add constraint ppp primary key (id)
————————————————————————————————
2.check约束:
就是给⼀列的数据进⾏了限制
⽐⽅说,年龄列的数据都要⼤于20的
表名(emp) 列名(age)
格式:
alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)
例⼦:
alter table emp add constraint xxx check(age>20)
3.unique约束:
这样的约束就是给列的数据追加的不重复的约束类型
格式:
alter table 表名 add constraint 约束名称 约束类型(列名)
⽐⽅说可以给ename列加个unique,让ename列的数据不重复
例⼦:
alter table emp add constraint qwe unique(ename)
————————————————————————————————
4.默认约束:
意思很简单就是让此列的数据默认为⼀定的数据
格式:
alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名
⽐⽅说:emp表中的gongzi列默认为10000
alter table emp add constraint jfsd default 10000 for gongzi
————————————————————————————————
这个有点难理解了,外键其实就是引⽤
因为主键实现了实体的完整性,
外键实现了引⽤的完整性,
应⽤完整性规定,所引⽤的数据必须存在!
其实就是个引⽤,
⽐⽅说⼀个表名称叫dept ⾥⾯有2列数据 ⼀列是ID⼀列是ENAME
id:表⽰产品的编号
ename:表⽰产品的名称
另外⼀个表格名称是emp ⾥⾯有2列数据,⼀列是ID ⼀列是DID
id:表⽰⽤户号
did:表⽰购买的产品号
要让emp表中的did列去引⽤dept表中的id
可以⽤下⾯的⽅法
格式:
alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引⽤的表名称 (列名)例⼦:
alter table emp add constraint jfkdsj foreign key (did) references dept (id)
约束定义存储在数据字典中,查询USER_CONSTRAINTS可以获得相关信息.
定义约束
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
…
[table_constraint][,…]);
<
CREATE TABLE employees
(employee_id NUMBER(6),
first_name VARCHAR2(20),
…
job_id VARCHAR2(10) NOT NULL,
CONSTRAINTS emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
列级的约束定义
column [CONSTRAINT constraint_name] constraint_type,
表级约束的定义
column,…
[CONSTRAINT constraint_name] constraint_type (column,…)
NOT NULL约束
只能定义在列级,不能定义在表级.
<
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL, //没有指定名字,将⽤系统SYS_命名
salary NUMBER(8,2),
foreign key references用法commission_pct NUMBER(2,2),
hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL); //⽤户定义了名字
⽤来保护⼀个表中的⼀个或者多个列没有任何两⾏在收到保护的列中具有重复的数据.ORACLE在唯⼀键列上⾃动⽣成⼀个唯⼀索引以实现唯⼀性
<
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
CONSTRAINT emp_email_uk UNIQUE(email));
PRIMARY KEY约束
唯⼀键的所有特征都适⽤于主键约束,只是在主键列中不允许有NULL值.⼀个表只能有⼀个主键.
<
CREATE TABLE departments
(department_id NUMBER(4),
department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
manager_id NUMBER(6),
location_id NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
FOREIGN KEY 约束
⽤来保护⼀个表中的⼀个或者多个列,它会通过⼀个主键主键或者唯⼀键保证对于每个⾮NULL值在数据库的其他地⽅都有⼀个数据可⽤.这个外部键就是在⽣成此约束的表(⼦表)中的⼀个或多个列,在⽗级表和⼦表中,相关列的数据类型必须匹配.外部键列和引⽤键(reference key)列可以位于相同的表中(⾃引⽤完整性约束).
<
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
deparment_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY(department_id) REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
上例中是在表级定义外部键约束,如果在列级定义,不同的是:
CREATE TABLE employees
(…,
department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id),
…);
//没有关键字FOREIGN KEY
FOREIGN KEY约束还有两个关键字是
ON DELETE CASCADE --当删除所引⽤的⽗表记录时,删除⼦表中相关的记录
ON DELETE SET NULL–与上⾯不同的是删除时,转换⼦表中相关记录为NULL值
默认情况下,如果没有指定以上两个中任⼀,则⽗表中被引⽤的记录将不能被删除.
[CONSTRAINT ] CHECK (
这⾥CHECK⼦句中的CONDITION应该求值为⼀个布尔值结果,并且可以引⽤相同⾏中其他列的值;不能包含⼦查询,序列,环境函数(SYSDATE,UID,USER,USERENV)和伪列(ROWNUM,LEVEL,CUR
RVAL,NEXTVAL),⼀个列上可以定义多个CHECK约束,如果所定义的条件为FALSE,则语句将回滚.
CREATE TABLE employees
(…,
salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary>0),
…);
添加约束
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
删除约束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
ALTER TABLE departments
DROP PRIMARY KEY CASCADE; //由于departments被employees.department_id引⽤了
对于NOT NULL约束,⽤ALTER TABLE MODIFY⼦句来删除
ALTER TABLE employees MODIFY last_name NULL;
关闭约束
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE; //如果没有被引⽤则不需CASCADE关键字
当你⽣成⼀个约束时,约束⾃动打开(除⾮你指定了DISABLE⼦句0,当⽤DISABLE关闭UNIQUE或者PRIMARY KEY约束时,ORACLE会⾃动删除相关的唯⼀索引,再次打开时,ORACLE⼜会⾃动建⽴的.
打开约束
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打开⼀个先前关闭的被引⽤的主键约束,并不能⾃动打开相关的外部键约束
可以从USER_CONSTRAINTS表和USER_CONS_COLUMNS视图中查询约束的信息
SELECT constraint_name,constraint_type,search_condition
FROM user_constraints
WHERE table_name=‘EMPLOYEES’;
约束类型
C–CHECK和NOT NULL都算为C TYPE
P–PRIMARY KEY
R–REFERENTIAL INTEGRITY就是外部键约束
U–UNIQUE
SELECT constraint_name,column_name
FROM user_cons_columns
WHERE table_name=‘EMPLOYEES’;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论