用户自定义数据类型是个确保数据库中域和数据紧密结合的好办法。数据的类型可能在整个数据库中都是一致的,每个数据的适用范围和他的数据类型是相关联的。sp_bindrule过程是个向后兼容过程,该过程为数据类型确定了一个适用范围。CREATE RULE命令也是个向后兼容命令,为域值的遵守产生了一个规则。该规则能被限制为用户自定义的数据类型。CREATE DEFAULT也是个向后兼容命令,而且也能被限制为用户自定义的数据类型。
这些向后兼容命令都是由Sybase演化而来的。SQL Server的未来版本是否支持他们目前还不能确定。微软推荐用户使用CHECK CONSTRAINT命令。然而,CHECK CONSTRAINTS不支持模块化编码。你必须为所有需要CHECK CONSTRAINT的表格的每一列都创建一个CHECK CONSTRAINT。另一方面,创建规则和缺省值,并把他们限制在一个用户自定义数据类型这个过程只需进行一次。用户自定义数据类型有非常多种,比如性别和标签的布尔值。性别的域值能是雄性,雌性,及未知。布尔值的域值能是数值,也能是真假值。
下面的例子说明了向后兼容方法的模块性和关联域的未来方法。
EXEC sp_addtype @typename= TrueFalse, @phystype = ’CHAR(1)’ ,_
@nulltype = ’NOT NULL’, @owner = ’dbo’
-- BACKWARD COMPATIBLE METHOD
CREATE RULE TrueFalseRule
AS @TrueFalse IN (’T’,’F’)
EXEC sp_bindrule TrueFalseRule, TrueFalse
CREATE DEFAULT TrueFalseDefault AS ’F’
EXEC sp_bindefault TrueFalseDefault, TrueFalse
CREATE TABLE backward_test1
(bt1_key1 INT IDENTITY NOT NULL,bt1_col1_flag TrueFalse)
CREATE TABLE backward_test2
(bt1_key2 INT IDENTITY NOT NULL,bt1_col2_flag TrueFalse)
-- FUTURE METHOD
CREATE TABLE future_test1
(ft1_key1 INT IDENTITY NOT NULL,ft1_col1_flag CHAR(1)
CONSTRAINT ck_ft1_flag1 CHECK ( ft1_col1_flag in (’T’,’F’) )
DEFAULT ’F’)
CREATE TABLE future_test2
(ft2_key1 INT IDENTITY NOT NULL,ft2_col1_flag CHAR(1)
CONSTRAINT ck_ft2_flag1 CHECK ( ft2_col1_flag in (’T’,’F’) )
DEFAULT ’F’)
使用ALTER命令修改,格式:
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型定义;
例如:
ALTER TABLE chatter_users MODIFY COLUMN ip VARCHAR(50);
SQL92标准定义了若干种基本数据类型,它们是SQL数据库中各种数据类型的基础。在《字符串数据类型》一文中,我们已经详细讨论了SQL92标准所定义的字符串数据类型。现在,我们来进一步讨论数值数据类型。
你开始尝试使用不同数据库实现方法并在它们传递数据,这样可以加深你对数值数据类型的理解。本文将给你一个数值数据类型的概要,你可以结合你的数据库的文档资料来学习。
在字符串、数值、datetime和interval这四种数据类型中,数值型的种类最多,约束也最多。在不同数据库实现方法之间交换数据时,数值型的精度也最容易降低。Oracle和SQL服务器之间的实现分歧(同样的数据类型长度不同)导致它们之间的数据传递过程会截短数字、改变它们的数值。因此,在移植程序前,你有必须很明确的了解两个平台间的数据定义差异,以及危及数据精度的风险。
谨记上述警告后,让我们看看SQL92标准的数值类型
基本数值类型
与数值有关的类型统称为数值类型。所有的数值都有精度,精度指的是有效数字位数。有的数值还有标度值(scale value),它用来指示小数点右边的最小有效数字位数。例如,数字123456的精度为6,标度值为2,可以定义为NUMERIC(6,2)。
每一个数据库实现方法都有关于如何近似数值或者截短数值的规则。除了提供获取数值长度和其它数值处理所需的属性外,SQL92提供了内建函数,如加、减、乘、除等。所有的数值类型之间都可以互相比较、互相赋值。尽管实现方法不同,但是它们有一个的共同点,即它们的结果一般都保留精度。
NUMERIC
用法:NUMERIC(精度,标度值)
是一种精确数值类型,即它是数字的值的文字表示。(可以对该数字进行取舍或者截取以符合指定精度,标度值由预定义的规则确定。)
为了符合标度值指定的小数数字位数,舍去多余的小数部分,舍入过程采用十进制。
数字的总长度等于精度,如果标度值大于0(有小数部分),则长度加1。
小数部分的位数要符合标度值。
DECIMAL | DEC
用法:DECIMAL(精度,标度值) | DEC(精度,标度值)
是一种精确数值类型。
用十进制。
数字的总长度等于精度,如果标度值大于0(有小数部分),则长度加1。
小数部分的位数不得小于标度值,小数位数的上限由数据库提供商设定。
INTEGER | INT
用法: INTEGER(精度)
是一种精确数值类型。
使用二进制或者十进制,这基于表示该数值的二进制位(bit)的个数(这是implementation-specific,与SMALLINT对应)。
标度值恒为0。
数据库供应商对其定义了精度和最小精度。
供应商可能会提供的默认精度。
SMALLINT
用法:SMALLINT(精度)
是一种精确数值类型。
位数取舍方法与INTEGER (二进制或者十进制)相同。
标度值恒为0。
精度等于或者小于INTEGER的精度。
主要可以分为下面四个数据库:
1、模糊数据库,指能够处理模糊数据的数据库。一般的数据库都是以二直逻辑和精确的数据工具为基础的,不能表示许多模糊不清的 事情。随着模糊数学理论体系的建立,人们可以用数量来描述模糊事件并能进行模糊运算。这样就可以把不完全性、不确定性、模糊性引入数据库系统中,从而形成模糊数据库。模糊数据库研究主要有两方面,首先是如何在数据库中存放模糊数据;其次是定义各种运算建立模糊数据上的函数。模糊数的表示主要有模糊区间数、模糊中心数、模糊集合数和隶属函数等。
2、统计数据库,管理统计数据的数据库系统。这类数据库包含有大量的数据记录,但其目的是向用户提供各种统计汇总信息,而不是提供单个记录的信息。
最近把ACCESS数据库迁移到了SQLSQERVER2000上,在 *** 作的过程中总结了一下两者存在的一些区别
1、对于日期字段
access表示为:#1981-28-12#
SQLSERVER2000表示为:'1981-02-12'
2、SQL语句区别
select
,update
在对单表 *** 作时都差不多,
但多表 *** 作时update语句的区别ACCESS与SQLSERVER中的UPDATE语句对比:
SQLSERVER中更新多表的UPDATE语句:
UPDATE
Tab1
SET
aName
=
bName
FROM
Tab1
a,Tab2
b
WHERE
aID
=
bID;
同样功能的SQL语句在ACCESS中应该是
UPDATE
Tab1
a,Tab2
b
SET
aName
=
bName
WHERE
aID
=
bID;
即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后
更新单表时:都为:
UPDATE
table1
set
ab='ss',cd=111
where
3、delete语句
access中删除时用:delete
from
table1
where
a>2
即只要把select
语句里的select
换成delete就可以了。
sqlserve
中则为:
delete
from
table1
where
a>2
即没有号
4、as
后面的计算字段区别
access中可以这样:select
a,sum(num)
as
s_num,s_numnum
as
all_s_num
即可以把AS后的字段当作一个数据库字段参
与计算。
sqlserver
中则为:select
a,sum(num)
as
s_num,sum(num)num
as
all_s_num
即不可以把AS后的字段当作一个数据库字段
参与计算。
5、[]与[!]的区别
access中多表联合查询时:select
tab1!a
as
tab1a,tab2!b
tab2b
from
tab1,tab2
,中间的AS可以不要。
sqlserve
中则:select
tab1a
as
tab1a,tab2b
tab2b
from
tab1,tab2
,中间的AS可以不要。
6、联合查询时,
access中多表联合查询:'select
a,b
from(select
a,b
from
tab1
where
a>3
union
select
c,d
from
tab2
)
group
by
a,b
sqlserve
中则'select
a,b
from(select
a,b
from
tab1
where
a>3
union
select
c,d
from
tab2
)
tmptable
group
by
a,b
即要加一个虚的表tmptable,表名任意。
7、access升级到sqlserver时,
可以用sqlserver的数据导入工具导入数据,但要做必要的处理。
access中的自动编号,不会自动转换SQL中的自动编号,只能转换为int型,要把它手工改成标识字段,种子为
1,把所有导入被sqlserver转化成的以n开头的字段类型的n去掉,如nvarchar->varchar把需要有秒类型的日期字段
改成datatime类型(SQL会把所有的日期开转化成smalldatetime型)
8、true与1=1
access用where
true表示条件为真,
sqlserver用where
1=1表示条件为真
9、判断字段值为空的区别
普通空:Access和sql
server一样
where
code
is
null
或
where
code
is
nol
null
条件空:Access:if([num]
is
null,0,[num])
或
if([num]
is
null,[num1],[num])
SQLServer:
isnull([num],0)
或
isnull([num],[num1])
10、SQL语句取子串的区别
access:MID(字段,n1,[n2]),LEFT(字段,n),RIGHT(字段,n)
如:select
left(cs1,4)+'-'+cs2
as
cs3
SQLServer:
SUBSTRING(expression,
start,
length)
如:select
substring(cs1,
1,
2)
+
substring(cs1,
4,
2)
+
'-'
+
cs2
as
cs3
11、布尔类型的区别
access:用“是/否”表示
SQLServer:用“bit”表示
引用地址:
>
以上就是关于如何定义数据库用户自定义数据类型全部的内容,包括:如何定义数据库用户自定义数据类型、mysql数据库中sql修改字段类型要怎么做、跟我学SQL:(八)数值数据类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)