如何定义数据库用户自定义数据类型

如何定义数据库用户自定义数据类型,第1张

用户自定义数据类型是个确保数据库中域和数据紧密结合的好办法。数据的类型可能在整个数据库中都是一致的,每个数据的适用范围和他的数据类型是相关联的。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:(八)数值数据类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10192867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存