1Z0-051-DDL-表的约束

表的约束

表约束是数据库能够实施业务规则以及保证数据遵循实体-关系模型的一种手段。如果

DML违法了约束,则将自动回滚整个语句。

1.1 约束类型

(1)UNIQUE 约束

注:对于具有UNIQUE约束的列,可以插入多个包含NULL的行,而对于PRIMARYKEY约束而言,不能存在这种可能。

(2)NOT NULL约束

(3)PRIMARY KEY 约束

注:UNIQUE和PRIMARY KEY 约束需要索引,如果不存在,就会自动予以创建。一张表只有一个主键。

(4)CHECK 约束

(5)FOREIGN KEY约束

注:外键约束在子表上定义,但此时在父表上必须存在UNIQUE或primary key约束。一般而言,unique约束所有列以及foreign key 约束中的所有列最好也定义not  null约束。

【问题】在字表中插入父表中没有匹配行的行,将发生错误,同样在父表中将在子表中已经存在的行删除,则删除相应的行将引发错误。

【解决方案1】在创建约束是创建为ON DELETE CASCADE。

这意味着,如果删除父表中的行,那么Oracle将在子表中搜索索引匹配行,并删除它们。这将自动发生。

【解决方案2】(此方案较温和)将约束创建为ONDELETE SET NULL.

在这种情况下,如果删除父表中的行,Oracle将在子表中搜索索引匹配行,并将外键列设为空。

1.2 定义约束

【案例】在创建表时定义约束

create table dept(

2 deptno number(2,0) not null constraint dept_deptno_pk primary key,

3 constraint dept_deptno_ck check (deptno between 10 and 90),

4 dname varchar2(20) constraint dept_dname_nn not null);

Table created.

SQL> alter tableemp rename to emp1;

Table altered.

SQL> create tableemp(

2 empno number(4,0) not null constraint emp_empno_pk primary key,

3 ename varchar2(20) constraint emp_ename_nn not null,

4  mgrnumber(4,0) constraint emp_mgr_fk references emp(empno),

5  dobdate,

6 hiredate date,

7 deptno number(2,0) constraint emp_deptno_fk references dept(deptno)

8  ondelete set null,

9 email varchar2(30) constraint emp_email_uk unique,

10 constraint emp_hiredate_ck check(hiredate >=dob +365*16),

11 constraint emp_email_ck

12 check((instr(email,‘@‘) > 0) and (instr(email,‘.‘) > 0)));

Table created.

1.3 约束状态

任何时候,约束都处于启用或禁用状态,验证或非验证状态。

  • ENABLE     VALIDATE   无法输入违反约束的行,而且表中的所有行都符合约束。(理想情况,默认)
  • DISABLE     NOVALIDATE  可以输入任何数据(无论是否符合要求),表中可能已经存在不符合要求的数据。(批量导入数据时)
  • ENABLE  NOVALIDATE   表中可能已经存在不符合要求的数据,但现在输入的所有数据必须符合要求。
  • DISABLE VALIDATE 这种情况不存在

SQL> alter tableemp modify constraint emp_ename_nn disable novalidate;

Table altered.

SQL> insert intoemp select * from emp1;

SQL> alter tableemp modify constraint emp_ename_nn enable novalidate;

Table altered.

SQL>update empset ename = ‘NOT KNOWN‘ where ename is null;

SQL> alter tableemp modify constraint emp_ename_nn enable validate;

Table altered.

1.4 约束检查

可以在执行语句是检查约束(IMMEDIATE 约束)或者提交事务是检查约束(DEFERRED约束)。默认情况下,所有约束都是IMMEDIATE约束,不能延迟。

将上例子中的代替方法将约束创建为DEFERRED(延迟)约束。

SQL> setconstraint emp_ename_nn deferred;

SQL> insert intoemp select * from emp1;

SQL>update empset ename = ‘NOT KNOWN‘ where ename is null;

SQL>commit;

SQL>set constraint emp_ename_nn immediate;

要使约束成为延迟约束,必须使用适当方法进行创建。

SQL>alter table emp add constraint emp_ename_nn

check(ename is not null) deferrable initiallyimmediate;

2

Table altered.

此时重新执行约束延迟才能成功。

SQL> setconstraint nn_emp_ename deferred;

Constraint set.

SQL> insert intoemp select * from emp1;

SQL>update empset ename = ‘NOT KNOWN‘ where ename is null;

SQL>commit;

SQL> setconstraint nn_emp_ename immediate;

Constraint set.

(1)查找约束的名称

SQL> selectconstraint_name,constraint_type,column_name

2  fromuser_constraints natural join user_cons_columns

3 where table_name =‘&Table‘;

(2)修改约束名称

Altertable  emp rename constraint old_name tonew_name;

(3)向webstore模式中添加如下约束

SQL>alter table orders add constraint pk_order_id primary key(order_id);

SQL>alter table products add constraint pk_product_id primarykey(product_id);

SQL>alter table order_items add constraint fk_product_id foreignkey(product_id) references products(product_id);

SQL>alter table order_items add constraint fk_order_id foreign key(order_id) references orders(order_id);

SQL>alter table orders add constraint fk_customer_id foreignkey(customer_id) references customers(customer_id);

时间: 2024-10-10 11:47:35

1Z0-051-DDL-表的约束的相关文章

Oracle_SQL(4) DDL 表和约束

数据库对象分为占存储空间的对象和不占存储存储空间的对象.占存储空间的对象主要包括:表.索引等.select distinct segment_type from dba_segments order by segment_type;不占存储空间的对象主要包括:视图.序列.函数.存储过程.包.触发器等.select distinct object_type from dba_objects order by object_type; DDL是用来创建(create).替换(replace).更改(

表级约束和列级约束

表级约束与列级约束 列级约束:指对一个数据列建立的约束  (用的多). 表级约束:指对多个数据列建立的约束. (1)列级约束既可以在列定义时声明,也可以在列定义后声明 (2)表级约束只能在列定义后声明 有些资料上,说,还有一个检测约束.

SQL Server建库-建表-建约束

----------------------------------------SQL Server建库-建表-建约束创建School数据库-------------------------------------- --创建School数据库之前:首先判断数据库是否存在,若存在则删除后再创建,若不存在则创建----exists关键字:括号里边能查询到数据则返回‘true’ 否则返回‘false’if exists(select * from sysdatabases where name =

constraint更新表列约束默认值

--更新约束 alter TABLE [dbo].[Sk_Recruit] drop constraint DF_Sk_Recruit_lastcommenttime go alter TABLE [dbo].[Sk_Recruit] add constraint DF_Sk_Recruit_lastcommenttime DEFAULT (getdate()) for [lastcommenttime] go constraint更新表列约束默认值

SQL Serverver -- 创建财政年度表 (约束)

-- 实例1: 创建财政年度表 (约束) -- 新建表: Create table FiscalYears(fiscal_year INTEGER NOT NULL PRIMARY KEY,start_date DATE NOT NULL,constraint valid_start_date CHECK(        year(start_date) = fiscal_year -1     AND MONTH(start_date)=10     AND DAY(start_date)=0

MySQL表级约束和列级约束

对一个数据列建立的约束,称为列级约束 对多个数据列建立的约束,称为表级约束 列级约束即可以在列定义时生命,也可以在列定义后声明. 表级约束只能在列定义后声明. NOT NULL和DEFAULT只存在列级约束. PRIMARY KEY.UNIQUE.FOREIGN KEY同时存在表级约束和列级约束.

创建基本表、数据库、列级/表级约束

3.5创建药品表,药品代码是主码,批号取值唯一 Create table medicine( Medicinecode char(10)primary key, Medicinename varchar(50), Pycode char(10), Dosagefrom char(10), standard char(15), Batchnumber char(20) unique, Productiondate date, Expirationdate date, Category char(1

3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束

 1 连接MYSQL服务器:mysql–uroot –p123456 查看中文问题 show variables like 'character%'; 2 修改mysql的字符集,退出mysql提示符界面: mysql -uroot -p--default_character_set=gbk; 3  数据库的操作:创建,查看,修改,删除 *创建: 创建一个名称为mydb1的数据库. createdatabase mydb1; 创建一个使用utf-8字符集的mydb2数据库. create d

数据库表的约束

在设计数据库时,为了确保数据库表中数据的质量,需要考虑数据的完整性(数据的完整性是指数据的正确性和一致性).举个例子:当你要为学生建立一个基本信息表StudentInfo时,这个表中学生的名字可以相同但是学号必须不一样,而他的年龄也得限制在一定范围内,像这样类似的"限制"有很多,如果违反了这些限制就制造了与现实不符的失真数据即破坏了数据的完整性.因为数据库不能自行判断哪些数据失真,所以需要认为添加一些约束来保证数据的完整性. 数据库中对表的约束有五种: 1.主键约束(Primary K

[Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图

目录 写在前面 文档与系列文章 表及其约束 存储过程 视图 总结 写在前面 由于一直在山西出差,有几天没更新博客了.昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章也只能先躺在收藏夹里,慢慢去消化了.废话不多说了,进入正题,那么这篇文章就让我们接着学习SchemaExport工具的使用吧,如何使用SchemaExport为表添加约束,生成存储过程,生成视图? 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactor