约束与数据库对象规则、默认值的探究(转)

约束与数据库对象规则、默认值的探究

约束、规则、默认值这三者在数据表中规定了数据进行操作时的限制条件。他们三者有关系也有区别,用了两天的时间研究了他们三者,总结如下。

首先让我们从关系角度来分析:

●浅谈约束、规则、默认值

1、约束,约束顾名思义是限制条件的意思,其实它的作用也是如此,它是对所要进行增删改查操作的数据进行一次检查,检查这些数据是否符合我们所要约束的条 件。举个例子:我们都经历过高考,考试规定考生不许带与考试无关的物品这就是一种约束。报名考试的考生可能因为某些意外没有进入考场考试,但大部分考生还 是进行了考试。那么在考场内就产生了两种情况空位和非空位,这就是我们约束条件的两种情况。我们继续分析,在考生进入考场的情况中,考生在答卷之前是必须 要在试卷和答题卡上填写自己的信息的,这些信息都是必须要填的因为它们唯一确定了一个考生,这里考生必须填写考生信息也就是我们所说的主键约束(主关键字 约束)。接下来我们用两个表来说明下外键约束:

那么如果我们在字段后面用Not Null规定了呢?也就是说在我们的考生信息表中的性别字段,该列是不允许为空的于是就用Not Null标识,但是如果我们不填的话呢,我们的系统就会用Default默认值约束来帮助我们天上一个值。接下来我们来看Check约束,该约束是要用条件表达式来限定所要填的数据的,如下:

[sql] view plaincopy

Create table 工资 (

name  char(10) primary key,

department  char(20) Not Null,

salary int not null check(salary>1000 and salary<4000)

)

创建了一个表该表中有三个字段,name、department、salary,并在salary字段设置了约束条件。该表如下图:

在表中填数据时后两个不符合条件是不正确的。

在约束中还分为两种:字段级约束和表级约束。字段级约束是只约束其中的一列,表级约束是约束多列,它们两个的区别并不大,我们在理解时可以将表级理解为字段级,即:被约束的多列可以看做捆绑成一列,被捆绑后的字段中的两个记录是不能重复的,如:

2、规则,规则顾名思义是规矩制度的意思,在进行表操作时它的作用和check约束条件是类似的,但是一个表中只有一个规则,可有多个check约束,如:

[sql] view plaincopy

Create table 薪水(

name  char(10) primary key,

  1. position  char(20) Not Null,

salary int not null

)

Create rule ru_salary

As @salary>1000 and @salary<4000

Go

Exec sp_bindrule ‘ru_salary’,  ’薪水.salary’

  1. Go

表说明如下:

3、默认值,用法同规则,它的作用类似于Default约束,是说在表中插入数据时,如果没有指定值,默认值自动指定数据值。

接下来我们在语法上分析三者,看图:

1、约束,创建方法大致有三种:

[sql] view plaincopy

  1. ——方法一:在创建表时用字句的方式创建约束

CREATE TABLE 表名(

列名数据类型,

……

<span style="color:#009900;"> CONSTRAINT 约束名 PRIMARY KEY (列名),                       ——主键约束

CONSTRAINT 约束名 UNIQUE (列名),                            ——唯一约束

CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 表名 (列名),  ——外键约束

CONSTRAINT 约束名 CHECK (检查条件)                           ——Check约束

</span> );

——方法二:在创建表时直接定义约束

CREATE TABLE 表名(

<span style="color:#009900;">           列名数据类型 NOT NULL,                                        ——非空约束

列名数据类型 NOT NULL PRIMARY KEY,                            ——主键约束

列名数据类型 NOT NULL UNIQUE,                                 ——唯一约束

列名数据类型 [NOT NULL] REFERENCES 表名(列名),                ——外键约束

列名数据类型 [NOT NULL] CHECK (检查条件)                         ——Check约束</span>

——方法三:在创建表后,通过更改表来定义

<span style="color:#009900;">   ALTER TABLE 表名 ALTER COLUMN 列名 SET NOT NULL;

ALTER TABLE 表名 ADD PRIMARY KEY (列名1,列名2…);

ALTER TABLE 表名 ADD UNIQUE (列名1,列名2,……);

ALTER TABLE 表名 ADD FOREIGN KEY(列名) REFERENCES 表名2 (列名2);

ALTER TABLE 表名 ADD CHECK (检查条件);

</span>

删除约束的语法为:ALTER TABLE 表名
DROP CONSTRAINT 约束名

2、规则。规则的应用操作,首先要创建但只创建是不能应用的要用sp_bindrule将规则绑定到字段或自定义的数据类型上才能起作用。

[sql] view plaincopy

——创建

<span style="color:#009900;">   Create rule 规则名 as 条件表达式

</span>

——绑定

<span style="color:#009900;"> Exec sp_bindrule ‘规则名’  , ‘表名.字段名’ | ‘数据类型’

</span>    ——解除绑定

<span style="color:#009900;">  sp_unbindrule  ‘表名.字段名’ | ‘数据类型’

</span>

——删除规则

<span style="color:#009900;">DROP RULE {rule_name} [,...n]

</span>

3、默认值的语法和规则是类似的,只需将规则中的rule改成关键字default即可

时间: 2024-10-15 00:17:56

约束与数据库对象规则、默认值的探究(转)的相关文章

修改mysql数据库字段内容默认值为当前时间

https://www.cnblogs.com/testway/p/5531969.html --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE table_name ADD COLUMN CreateTime datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ; --修改CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE table_nam

修正或添加字段默认值约束的名称

旧项目中的数据库约束名称不规范,写了个脚本重新修改. 1. 名称重新修改为已有的默认值约束的名称为'DF_' + 表名 + 字段名: 2. 没有设置默认值约束的列设置默认值,字符串为空,数值为0: 3. 时间字段除了addtime不加默认值: --修正或添加字段默认值约束的名称为DF_表名_字段 /* SELECT tabName= LOWER(O.name), --表名 colName=LOWER(C.name), --字段名 coltype= LOWER(T.name), --类型 dfVa

SQL Server 删除表的默认值约束

首先查出字段的默认值约束名称,然后根据默认值约束名称删除默认值约束 declare @constraintName varchar(200) select @constraintName = b.name from syscolumns a,sysobjects b where a.id=object_id('TB_KYSubProject') and b.id=a.cdefault and a.name='Final_Belong_Programme' and b.name like 'DF%

hibernate插入实体类【数据库默认值】不生效的问题

第一个问题老生常谈 如果表结构设置默认值 数据库实体类不对该字段进行复制的情况下插入数据记录 字段直接以数据库设置的默认值进行插入hibernate本身可以根据XML配置进行生效此配置 1 <hibernate-mapping 2     package="*.entity"> 3     <class name="ProEntity" table="PRODUCTINFO" dynamic-insert="true&

数据库字段设置为&lt;非空&gt;&lt;默认值&gt;

为什么数据库要设置默认值呢?因为我们希望在插入数据时,有意或无意间被忽略的字段能够交由MySQL按我们事先预想的方式处理,例如一些默认正常状态码.用户插入数据时候尚未设置的文本字段,诸如此类. 假设student表里有一个字段score被设置为<非空><默认值>,插入一条数据记录时,score字段值为空<''>,那这时score的字段值为<''>还是<默认值>? 设置默认值的作用只有在忽略了字段时才会发挥作用.何为忽略了字段,就是在写SQL插入语

如何改变sql server2000数据库列属性的默认值为0

--如果字段原来无默认值,直接执行如下语句,添加默认值: alter table 表名 add default(1) for 字段名 --如果原来有默认值,现在要更改默认值,则需要先把原来的默认值drop掉,再添加新的默认值 alter table 表名 drop constraint 默认值约束的名称 --如果不知道默认值约束的名称,用如下语句查询得到: select [name] from sysobjects t where id = (select cdefault from sysco

Hibernate实体类与数据表字段默认值之间的优先关系

在日常的应用开发过程中,我们一般都会使用对象关系映射来通过面向对象的编程模型来解决数据库的操作,我们生产过程当中使用较多的当属Hibernate框架了,他非常灵活,为我们提供了多种方式来实现数据层的操作与管理.通过实体类与数据表的映射,实体类对应表,属性对应字段就可以将我们想要生产的对象赋值到数据库,但是我们有时也需要查询对象,但是无论什么操作,都必须通过实体类来传递数据. 有时我们数据库有一些字段是数据库自动赋值,禁止用户通过程序修改的,如记录生成时间,那么如果你实体类按照正常情况下,你为了查

asp.net EF model中的默认值设置

在做数据库规划时,通常会规划一些系统字段,也就是由数据库本身自行指定默认值到这个字段上,创建新的“创建时间(CreateDate)”字段就会常常这样设计. 如果希望能有默认值,且让.net 程序在新增信息到数据库时不用指定的值的话,那么你需要在你的该属性(property)上面加上一个DatabaseGenerated属性(Attribute),并传入DatabbaseGeneratedOption.Computed参数到DatabaseGenerated 属性中. 在调用DatabaseGen

hibernate 映射文件配置默认值方法

问题描述:     hibernate技术中对应数据库中每一个表,都会有一个映射文件与之对应,此文件描述数据库表中每一个字段的类型.长度.是否可空等属性.在进行表中记录的插入(更新)操作时,hibernate会根据映射文件中的描述自动生成一个包含所有字段的插入(更新)sql语句,此时如果映射文件中某字段的值为空(NULL)而其在数据库表中定义的默认值不为空,hibernate会将空值插入到表中,而不会使用此字段的默认值. 解决方法:     在hibernate映射文件对数据库表的描述中,加入d