firebird 中的域
转自:http://blog.163.com/doleph@126/blog/static/39901730200851695416520/
firebird的域是一个数据库全局对象,相当于其他关系数据库的自定义数据类型。域一旦创建,数据库中的其他对象例如表、列就可以使用它。使用域,不但可以加强数据的一致性,还可以扩展、丰富firebird的数据类型。
1、为什么要使用域
域应该说是firebird数据库系统的一个专有术语,很多人被它的名字搞昏了。说到底,域就是firebird中的自定义数据类型。使用域的主要好处是加强数据的一致性,凡是使用域的地方,毫无例外的遵守该域的约束,此外,域还可以让你使用具有你的开发系统特点的自然语言说明数据,例如你的系统中有多个表具有地址这个列,那么你就可以创建一个地址域如Address,让这些列都引用该地址域,既易懂又保证了一致性。域对数据库维护也有好处,因为对域的修改自然也就修改了使用域的表,如果你不使用域的话,你必须去修改表的定义,这样,域就起到了隔离的作用,降低了维护量。
6.2、创建域
创建域的语法是:
Create Domain Domain_Name
[As] <Datatype>
[Default { Literal | Null | User}]
[Not Null] [Check ( <Dom_Search_Condition>)]
[Collate Collation];
其中:Domain_Name是创建的域名,Datatype是域的数据类型。其它为可选项。
6.2、1、指定域的数据类型
必须为域指定数据类型。域的数据类型和列一样,包括firebird所有可以使用的类型。指定数据类型的语法是:
< Datatype> = Smallint
| Integer
| Float
| Double Precision
| {Decimal | Numeric}
[(Precision [, Scale])]
| {Date | Time | Timestamp)
| {Char | Character | Character Varying | Varchar}
[( Int)] [Character Set Charname]
| {Nchar | National Character | National Char} [Varying] [( Int)]
|Blob
|Boolean <Array_Dim> = [X:Y [, X1:Y1 …]]
例如:
Create Domain Deptarray As Char(31) [4:5];
Create Domain Descript As Blob Sub_Type Text Segment Size 80 Character Set Sjis;
下面是一个使用域的例子:
Create Domain Address As Varchar(40);/*创建一个地址域*/
Create Table Mytbl (Name Char(10),Addr Address, Age Integr);
2、2、指定域的缺省值
你可以给域指定缺省值,这样当你没有明显地给出值时也能将缺省值自动地插入到域中。缺省值可以节省数据输入时间并且可以减少错误的发生。缺省值使用DEFAULT表示。可能的缺省值如下:
1、文字。如用户指定的字符、日期、其它值等。例如:
Create Domain Hiredate As Date Default ‘Now’;
缺省值为当前系统日期。
Create Domain Msg As Varchar(30) Default ‘Hello’;
缺省值为字符HELLO
2、NULL。空值,当没有输入任何值时,以空值代替。
3、USER。以当前用户名作为缺省值。例如:
创建域:
Create Domain Username As Varchar(20) Default User;
创建表: Create Table Orders (Order_Date Date, Entered_By Username, Order_Amt Decimal(8,2));
6.2、3、指定域的非空值属性
给域指定Not Null属性强制用户必须输入值。例如:
Create Domain Money As Numeric(15,2) Not Null;
这样当输入时用户必须对MONEY所在列输入一个值。
注意:NULL缺省值不能和NOT NULL属性并存。
6.2、4、指定域的检查约束
检查约束是一必须得到满足的逻辑条件,当基于域的列的输入值使检查约束的条件为真时输入值方能进入列。检查约束可以使值在进入到表之前得到某种验证,从而增强数据的完整性。
检查约束的条件是:
<Dom_Search_Condition> ={
Value <Operator> <Val>
| Value [Not] Between <Val> And <Val>
| Value [Not] Like <Val> [Escape <Val>]
| Value [Not] In (<Val> [ , <Val> …])
| Value Is [Not] Null
| Value [Not] Containing <Val>
| Value [Not] Starting [With] <Val>
|(<Dom_Search_Condition>)
|Not <Dom_Search_Condition>
| <Dom_Search_Condition> Or <Dom_Search_Condition>
| <Dom_Search_Condition> And <Dom_Search_Condition> }
<Operator> ={=|<|>|<=|>=|!<|!>|<>|!=}
其中:
关键字value是一个占位符号,它代表了基于域的列值,在检查约束中,必须使用value表示目的值。
Operator操作符有:等于、小于、大于、小于等于、大于等于、不小于、不大于、不等于。
逻辑运算符Not是对表达式求反,AND是逻辑与,其前后的两个表达式全为真时整个表达式的值才为真,OR是逻辑或,表示满足两个表达式之一即可。
Between <Val> And <Val>将范围限定在两个数值之间。
Like <Val>则表示与某个值相近、类似。
In (<Val> [ , <Val> …])说明取值必须是括号中所列值的其中一个,而不能是括号外的其他值。
Containing <Val>是包含某个值。
Starting [With] <Val>则是指以某个值开头。
检查约束的例子如下:
Create Domain Custno As Integer Check (Value > 1000);
域的值必须大于1000。
Create Domain Custno As Integer Default 9999 Check (Value > 1000);
带有缺省值9999,小为1000。
Create Domain Prodtype As Varchar(12) Check (Value In ('Software', 'Hardware', 'Other', 'N/A')); 值必须在'software', 'hardware', 'other', 'N/A'四者之中。
Create Domain California As Varchar(25) Check (Value Like '%, CA);
百分号%是一个通配符,代表任意数目的字符,下划线_也是一个通配符,它代表一个任意字符。
Create Domain Jobgrade As Smallint Check (Value Between 0 And 6)
值必须在0到6之间。
Create Domain Projno As Char(5) Check (Value = Upper (Value))
值总是大写。
如果你在创建表时选择这些域对象作为列类型,那么表中的这些列值必须遵循上述value的约束。
2、5、为字符类型的域指定字符集
如果你创建的域是字符类型,你可以为其指定字符集及排序。例如:
Create Domain Mydomain As Char(20) Character Set Gb_2312 Not Null Collate Gb_2312
3、更改域
alter domain可以更改域的除了NOT NULL属性之外的所有方面,包括更改数据类型、更改域名、删除缺省值更改新的缺省值、删除已有检查约束创建新的检查约束等。
6.4、删除域
Drop Domain可以将现存的域从数据库中删除。但是如果要删除的域已经被其它数据库对象引用,你无法进行删除。你必须先解除这种引用,然后再删除域。同样,只有域的创建者、超级用户或具有操作系统根目录权限的用户才能删除域。 删除域的语法是:
DROP DOMAIN Domain_Name;
其中:domain_name为要删除的域名
5、使用域扩展InterBase的数据类型
一些人使用过一段时间的firebird后,抱怨说firebird提供的数据类型太少了。的确,与其他关系数据库相比,InterBase确实提供了为数不多的数据类型,但是,实际上只要用心思考一下,就会发现firebird的域对象可以帮助我们在基本数据类型的基础上扩展很多有用的数据类型。事实上,经过这种扩展后,你会发现firebird的数据类型基本上和sybase11.9、Ms SqL server2000提供的数据类型相当。
1、货币数据类型money、smallmoney 由于firebird的dialect 3已经实现了大型数据,完全可以使用numeric类型构造出货币类型。
money类型:
create domain money as numeric(18,4);
smallmoney类型:
create domain smallmoney as numeric(9,4);
你可以根据实际情况改变长度和小数点位数使之符合你的要求。
2、其他整数类型tinyint、bigint tinyint类型(0~255):
create domain tinyint as integer check(value between 0 and 255);
bigint类型(-2的63次方~2的63次方-1):
create domain bigint as numeric(18,0);
3、图像类型image
通过BLOB类型的子类型构造。
create domain image as blob sub_type 0
4、文本类型text
通过BLOB类型的子类型构造。
create domain text as blob sub_type 1
5、用户自定义应用数据类型 使用域,你可以象其他关系数据库一样创建丰富多彩的功能各异的自定义数据类型,使用在你的数据库系统中。一般的据我了解,至少在应用系统中,应该存在上述几类自定义数据类型。
相关文章