第3章 字段的属性和约束
vf 第一章---第三章复习(1)
![vf 第一章---第三章复习(1)](https://img.taocdn.com/s3/m/2130e77b58fafab069dc0246.png)
5.DB, DBS ,DBMS之间的关系是 DBS 包括 DB 和DBMS ____________ 6.数据库系统的特性:
(1)实现数据共享,减少数据冗余 (2)特定的数据类型 (3)数据独立性 (4)数据的据模型:指数据库中数据与数据之间的 关系。 – 常见的数据模型有三种,分别是 层次模型 网状模型 ___________ 、___________ 、 关系模型 ___________ 关系型 – vfp6.0 是一种典型的___________ 数据 模型。 二维表 2.关系模型用___________ 形式表示实体 之间的联系的数据模型。
表的相关概念
定义字段:为每个字段指定名称、数据类型和宽度,它们决定了表中的 数据是如何被标识和保存的 ⑴ 字段名:以字母或汉字开头,由字母、汉字、数字或下划线组成, 128 个字符,自由表字段名最长为 不能包含空格。数据库表字段名最长为____ 10 个字符 ____ ⑵ 字段类型:决定了存储在字段中的值的数据类型 ⑶ 字段宽度:指能够容纳存储数据的长度
高考链接
• 2012年高考 • 28.在关系型数据库管理系统中有3种基本 的关系操作,不包括下面哪种..... ......(B ) • A.筛选 B.比较 • C.投影 D.连接 •
高考链接
• 2013年高考 • 28. 在Visual FoxPro中,以下关于关系模型 的叙述错误的是...........( ) B • A.构成关系模型的二维表中不允许有重复 的字段名 • B.构成关系模型的二维表中同一列数据可 以有不同的数据类型 • C.构成关系模型的二维表中不允许有完全 相同的记录 • D.在关系模型中数据被组织成二维表
2.5表的基本操作
• (2) 菜单方式追加表记录
数据库的约束简介
![数据库的约束简介](https://img.taocdn.com/s3/m/2915286000f69e3143323968011ca300a6c3f675.png)
数据库的约束简介约束的简介数据的完整性是指数据的正确性和⼀致性,可以通过定义表时定义完整性约束,也可以通过规则,索引,触发器等。
约束分为两类:⾏级和表级,处理机制是⼀样的。
⾏级约束放在列后,表级约束放在表后,多个列共⽤的约束放在表后。
完整性约束是⼀种规则,不占⽤任何数据库空间。
完整性约束存在数据字典中,在执⾏SQL或PL/SQL期间使⽤。
⽤户可以指明约束是启⽤的还是禁⽤的,当约束启⽤时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。
约束类型总的来说有五种:唯⼀性和主键约束、外键约束、检查约束、空值约束、默认值约束,有五⼤关键词,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT1。
唯⼀性和主键约束。
要求某⼀列,或⼏列不能有重复的值,建⽴主键约束和唯⼀约束时,Oralce会基于约束列⾃动建⽴唯⼀索引;主键约束不允许为NULL,唯⼀约束允许为NULL,⼀张表只能建⽴⼀个主键约束。
唯⼀性和主键约束类似,只是关键词不同⽽已,语法⼀致。
创建约束CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL PRIMARY KEY,)CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL CONSTRAINT PK_ID PRIMARY KEY,)CREATE TABLE TABLE_NAME(COL1 VARCHAR2(32) NOT NULL,COL2 VARCHAR2(32) NOT NULL Foreign Key,CONSTRAINT PK_TABLE_NAME PRIMARY KEY(COL1,COL2))修改约束ALTER TABLE Table_NameADD CONSTRAINT PK_Table_Name PRIMARY KEY NONCLUSTERED(Col1)【这⾥表明了是聚集还是⾮聚集主键索引】如果唯⼀性约束保护多个数据列,那么唯⼀性约束要作为表约束增加。
第3章 数据表的创建和管理
![第3章 数据表的创建和管理](https://img.taocdn.com/s3/m/a7f277cccc22bcd126ff0c5e.png)
ALTER TABLE student drop CONSTRAINT PK_student
3.3.8 唯一约束
▪ 唯一约束(unique constraint)用于指定一 个列或多个列的组合值具有唯一性
✓ 唯一约束指定的列可以为NULL,但主键约束 所在的列则不允许为NULL。
修改字段
ALTER TABLE 表名 ALTER COLUMN 列名<列属性>
【例】在course表中,将courseid列的数据类型 改为varchar(20),允许空。 ALTER TABLE course
ALTER COLUMN courseid varchar(20) NULL
修改列名
sp_rename '表名.原列名','新列名',' COLUMN‘
3.2.1 增加、删除和修改字段
ALTER TABLE table [ALTER COLUMN column_name {new_data_type[(precision[,scale])]}|[NULL|NOT NULL]}] |ADD{<column_defintion>|<computed_column_definition>} |<table_constrain>}[,…n] |DROP{[CONSTRAINT]constraint_name |COLUMN column_name}[,…n]
依赖关系 ▪ 掌握如何利用SQL Server管理控制台和Transact-SQL语言
删除表
▪ 3.1 创建数据表 ▪ 3.2 管理数据表 ▪ 3.3 使用约束实现数据完整性 ▪ 3.4 插入、删除、修改表中数据
第三课 字段,属性和方法的使用
![第三课 字段,属性和方法的使用](https://img.taocdn.com/s3/m/afd3b6fdfab069dc502201c1.png)
get
{
return m_strCount;
}
set
{
if (value>m_strCount)
{
strArray = new string[value];
for (int i=0;i<value;i++)
在泛型类中,非泛型方法可以访问类级别类型参数,如下所示:
C# 泛型方法代码
class SampleClass<T> { void Swap(ref T lhs, ref T rhs) { } } 如果定义的泛型方法接受与包含类相同的类型参数,编译器将生成警告 CS0693,因为在方法范围内,为内部 T 提供的参数将隐藏为外部 T 提供的参数。除了类初始化时提供的类型参数之外,如果需要灵活调用具有类型参数的泛型类方法,请考虑为方法的类型参数提供其他标识符,如下面示例中的 GenericList2<T> 所示。
}
}
属性可以忽略get或set访问器,但是不能两个都忽略.
set访问器包含一个隐藏的参数value,该参数包含从客户代码传送过来的值.
公共属性及其底层类型最好使用相同的名称,因为它们之间的联系将很清晰.
字段使用camelCase(xxXxx),如dateOfBirth,而属性使用PacalCase(XxXxx),如DateOfBirth.一些开发人员喜欢在字段的开头使用下划线,如_Name,属性也应使用名词来命名.
-不能把属性作为引用类型或输出参数来进行传递。
-get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
第3章 VFP 6.0数据库及其操作(4)
![第3章 VFP 6.0数据库及其操作(4)](https://img.taocdn.com/s3/m/4129a98884868762caaed554.png)
3.7.1 设置表的字段属性
3. 标题
字段标题将作为该字段在浏览窗口中的列标题, 字段标题将作为该字段在浏览窗口中的列标题,以 浏览窗口中的列标题 及表单表格中的默认标题名称 默认标题名称。 及表单表格中的默认标题名称。 为了在浏览窗口、 为了在浏览窗口、表单或报表中显示时让人更容易 了解该字段所代表的含义, 了解该字段所代表的含义,可以为字段指定一个字符 作为显示时的标题文字。 串,作为显示时的标题文字。如果没有为字段设置标 就显示相应的字段名。 题,就显示相应的字段名。 注意:字段标题仅仅改变在浏览窗口、 注意:字段标题仅仅改变在浏览窗口、表单或报表 显示表记录时字段名称栏所显示的文字内容, 中,显示表记录时字段名称栏所显示的文字内容,在 程序中引用该字段变量时仍应该用其字段名。 程序中引用该字段变量时仍应该用其字段名。
11
3.7.2 设置表的有效性规则
3. 表的有效性规则(即记录级规则) 表的有效性规则(即记录级规则)
控制用户输入到记录中的信息类型, 控制用户输入到记录中的信息类型,检验输入的整 条记录是否符合要求。 条记录是否符合要求。 字段级有效性规则只对应一个字段, 字段级有效性规则只对应一个字段,记录级有效性 规则通常用来比较同一条记录中的两个或两个以上 两个或两个以上字 规则通常用来比较同一条记录中的两个或两个以上字 段值,确保它们遵守在数据库中建立的有效性规则。 段值,确保它们遵守在数据库中建立的有效性规则。 注意: 注意:记录的有效性规则通常在输入或修改记录时 被激活,在删除记录时一般不起作用。 被激活,在删除记录时一般不起作用。
3
3.7.1 设置表的字段属性
2. 格式
实质上就是一种输出掩码,决定了字段在表单、 实质上就是一种输出掩码,决定了字段在表单、浏 览窗口或报表中的显示方式 显示方式。 览窗口或报表中的显示方式。 例:在“课程”表中,如果要求凡是课程名中带字 课程”表中, 母的必须一律显示为大写字母,则格式可定义为20个 母的必须一律显示为大写字母,则格式可定义为 个 )。这样在输入 “!”(假设课程名的数据宽度为 )。这样在输入 ” 假设课程名的数据宽度为20)。 课程名数据时,只要遇到小写字母, 课程名数据时,只要遇到小写字母,系统就会自动转 换为大写字母。 换为大写字母。 常用的掩码及其含义:课本 常用的掩码及其含义:课本P95 表3.7。 。
VFP-03第三章-数据与数据运算
![VFP-03第三章-数据与数据运算](https://img.taocdn.com/s3/m/deb96e1a87c24028915fc358.png)
其中?表示在下一行上显示若干个数据的值;
??表示在同一行上显示若干个数据的值。 3、逻辑型常量 表示逻辑判断结果,只有“真”或“假”两种结果, 定界符为圆点,内存中占用一个字节。
常量表示形式为:.T.、.t.、.Y.、.y. 表示真,
.F.、.f.、.N.、.n.表示假。
4、日期常量
用于表示日期,其规定格式以{mm/dd/yyyy}表示。定 界符:{ } 常用分隔符:斜杠(/)、连字符(-)、句点(.)和 空格。
-:两字符串首尾相连,且将首字串尾部的空格移至新
串的尾部。
$(字符串包含运算符):
使用格式:<子字符串>$<字符串> 若字符串包含子字符串,其值为.T.,否则为.F.。 举例: “计算机 ” + “软件” 结果值为:“计算机 软件 “ “计算机 ” - “软件” 结果值为:“计算机软件 ”
三.时间日期表达式
list memory like y*
三.字段变量
字段变量是数据库管理系统中的一个重要概念。它与 记录一纵一横构成了数据表的基本结构。 一个数据库是由若干相关的数据表组成,一个数据表 是由若干个具有相同属性的记录组成,而每一个记录又是
由若干个字段组成。
字段变量就是指数据表中已定义的任意一个字段。
字段变量的类型有数值型、浮点型、整型、双精度型、
设置日期格式的命令
●设置日期分隔符:set mark to [分隔符] 可设置为:连字符(-)、句点(.)和空格;系统默认 的分隔符为:斜杠。 如:Set Mark to “-” 用字串定界符括起来。
●设置日期显示格式:set date [to] 格式
格式:AMERICAN、USA、MDY、GERMAN、 BRITISH、FRENCH、ITALIAN、DMY、ANSI、JAPAN、 YMD 主要设置日期是:年-月-日、月-日-年、日-月-年
MySQL中的数据字段属性设置
![MySQL中的数据字段属性设置](https://img.taocdn.com/s3/m/c1fabf5df4335a8102d276a20029bd64793e6241.png)
MySQL中的数据字段属性设置MySQL是目前最流行的关系型数据库管理系统之一,广泛应用于各类网站和应用程序中。
对于数据库的设计与优化,数据字段属性的设置是非常重要的一部分。
本文将围绕MySQL中的数据字段属性设置展开讨论,探索不同属性设置对数据库性能和数据存储的影响。
一、数据字段属性的基本概念在MySQL中,每个数据表都由一系列的数据字段组成。
每个字段都具有特定的类型和属性,用于存储和描述不同类型的数据。
常见的数据字段类型包括整数型、字符型、日期型等。
数据字段属性是用于进一步定义字段的特性和约束条件的设置。
它们可以控制字段是否允许为空、字段的默认值、字段的长度和精度、字段是否唯一等。
正确地设置数据字段属性可以确保数据的完整性和一致性,同时也可以提高查询和插入操作的效率。
二、字符型字段属性设置字符型字段是存储文本字符串的常见数据类型。
在MySQL中,可以通过不同的属性设置来指定字符型字段的长度、字符集和排序规则。
下面是一些常用的字符型字段属性设置:1. 字段长度:字符型字段的长度可以通过指定字段的最大字符数来设置。
合理设置字段长度可以避免数据截断,同时也可以节省存储空间。
2. 字符集:MySQL支持多种字符集,包括UTF-8、GBK等。
通过设置字符集,可以确保数据能够正确地存储和展示。
3. 排序规则:通过设置排序规则,可以控制字符型字段在进行比较和排序时的行为。
常见的排序规则包括二进制排序和不区分大小写排序。
三、数值型字段属性设置数值型字段用于存储数值数据,包括整数和小数。
在MySQL中,可以通过不同的属性设置来指定数值型字段的数据类型、长度和精度。
下面是一些常用的数值型字段属性设置:1. 数据类型:对于整数型,可以选择TINYINT、INT、BIGINT等不同的数据类型。
对于小数型,可以选择DECIMAL、FLOAT、DOUBLE等不同的数据类型。
选择合适的数据类型可以避免数据溢出和损失精度的问题。
字段和属性的理解
![字段和属性的理解](https://img.taocdn.com/s3/m/c47c50df27fff705cc1755270722192e4536583d.png)
字段和属性的理解在get和set访问器中都加⼊了条件,并且是我⼿动书写的,VS给我们提供了⼀个⾃动封装字段的⽅法,下⾯我们来按照我说的步骤来试⼀下,在类中定义⼀个字段 string a="我是A"; 接着把⿏标停放到a处,点击右键“重构”--“封装字段”,VS会⾃动的封装a字段,并且取名为A,你也可以更改属性的名字,点击确定,a字段的A属性就封装好了,封装后的代码为:string a = "我是A";public string A{get { return a; }set { a = value; }}通常我们都习惯叫get访问器和set访问器,如果我们想得到类中的属性值时,⽤到的是get访问器return返回出值,如果我们想给属性赋值的时候,就会⽤到set访问器,属性有4种形式:分别是可读可写属性,既有get也有set访问器;如果只有get访问器,这个属性是只读的,⽆法赋值;如果只有set访问器,这个属性就只能被赋值,不能读取,以后我们要学习界⾯设计时,所有的控件都有很多的属性,这些属性就都是只写的,并且有⼀定的赋值要求,⽐如在⽹页上画⼀个表格,我们设置表格的边框颜⾊,就使⽤到边框颜⾊的属性,如果我们赋的颜⾊值不符合规范,就会出现错误提⽰;还有⼀种属性是加⼊了static关键字的静态属性,静态属性只能封装静态数据,⽐如:string static a = "我是静态A";public static string A{get { return a; }set { a = value; }}下⾯我们把上⾯的例⼦继续深化,声明⼀个对象boby,我们来具体看⼀下如果利⽤属性的读写功能:1 class Ren2 {3 //先定义⼀个私有变量实际年龄age4 int age = 10;56 //再定义⼀个属性,7 public int Age8 {9 //输出时的年龄⽐实际年龄age⼤三岁,即输出的是10+3岁10 get { return age + 3; }11 //给年龄赋值时,先判断年龄的范围12 set13 {14 //如果年龄⼩于1岁或是⼤于120岁时,不允许赋值,提⽰错误。
MySQL中的字段属性与约束设计指南
![MySQL中的字段属性与约束设计指南](https://img.taocdn.com/s3/m/be96d14d8f9951e79b89680203d8ce2f01666570.png)
MySQL中的字段属性与约束设计指南导语:在数据库设计中,字段属性与约束的设置对于数据的完整性和性能至关重要。
MySQL是一种常见的关系型数据库管理系统(RDBMS),并且在许多应用中被广泛使用。
本文将介绍MySQL中字段属性与约束的设计指南,帮助您正确地定义和使用这些特性,以优化数据结构并提高数据库性能。
一、字段属性设计指南1. 数据类型的选择在MySQL中,不同的数据类型具有不同的存储需求和操作特性。
因此,正确选择合适的数据类型对于优化数据库结构至关重要。
以下是一些常见的数据类型以及它们的特点:- 整数类型(INT、BIGINT):适用于整数数据,具有较小的存储需求和高效的比较操作。
- 浮点数类型(FLOAT、DOUBLE):适用于具有小数部分的数值,但具有一定的精度损失。
- 字符串类型(CHAR、VARCHAR):适用于存储文本数据,CHAR具有定长特性,而VARCHAR具有变长特性。
- 日期和时间类型(DATE、DATETIME):适用于存储日期和时间信息,具有方便的处理函数。
在选择数据类型时,需要根据具体的数据特点和需求来确定。
如果数据量较大,应优先考虑较小的数据类型来降低存储空间和提高性能。
2. 字段长度设定针对字符串类型的字段,长度限制是一项重要的属性设置。
太小的长度限制会导致数据截断或被截断,而过大的长度限制则会浪费存储空间。
因此,需要根据实际业务需求来合理地设置字段长度。
例如,对于用户名字段,如果业务需求是用户名长度不超过20个字符,则可以将该字段定义为VARCHAR(20),这样可以确保存储的数据不会超出限制,并且不会浪费额外的存储空间。
3. 空值属性设定在MySQL中,字段可以被设置为允许为空值或不允许为空值。
对于某些字段,如主键字段或必填字段,可以设置为不允许为空值,以确保数据的完整性。
另一方面,对于某些可选字段,可以将其设置为允许为空值,以便在数据录入时更加灵活。
但是,需要注意在查询和数据处理时对空值进行适当的处理,以免出现意外的结果。
国家开放大学《数据库基础与应用》形考任务1-4完整答案
![国家开放大学《数据库基础与应用》形考任务1-4完整答案](https://img.taocdn.com/s3/m/8a5272eebdeb19e8b8f67c1cfad6195f312be8bd.png)
国家开放大学《数据库基础与应用》形考任务1-4完整答案课程考核本课程考核采用形成性考核与终结性考试相结合的方式。
形成性考核占课程综合成绩的30%,终结性考试占课程综合成绩的70%。
最终成绩=形考成绩30%+终考成绩70%考核方式相关信息以国家开放大学当学期发布的考试安排文件为准。
一、单选题1.在利用计算机进行数据处理的四个发展阶段中,第三个发展阶段是()。
【答案】数据库系统2.属性的取值范围被称为()。
【答案】域3.实用ER图进行描述的是()。
【答案】概念数据模型4.若实体A和B是1对多的联系,实体B和C是1对1的联系,则实体A和C 是()联系。
【答案】1对多5.若实体A和B是多对多的联系,实体B和C是1对1的联系,则实体A和C 是()联系。
【答案】多对多6.下面不属于数据库体系结构中三级模式的是()。
【答案】关系模式7.在文件系统中,存取数据的基本单位是()。
【答案】记录8.层次数据模型的结构是一种()。
【答案】树结构9.一个关系中的每一行称为一个()。
【答案】元组10.设D1、D2和D3定义域中的基数分别为2、3和4,则D1×D2×D3的元组数为()。
【答案】2411.设D1、D2、D3和D4为定义域,则在它们的笛卡尔积的运算结果中,每个元组具有的分量个数为()。
【答案】412.设关系R1具有a1个属性和b1个元组,关系R2具有a2个属性和b2个元组,则关系R1×R2所具有的属性个数为()。
【答案】a1+a213.若一个关系为R(学生号,姓名,性别,年龄),则可以作为主码的属性为()。
【答案】学生号14.设两个关系R1和R2中分别包含有m和n个元组,R1对R2存在着一对多的联系,将其进行自然连接,在得到的运算结果中最多包含的元组个数为()。
【答案】n15.设一个关系R1中的属性A是外码,它对应关系R2中的主码为B,其中被称为父关系的是()。
【答案】R216.设一个集合A={3,4,5,6,7},另一个集合B={1,3,5,7,9},则A和B的交集中包含的元素个数为()。
《Access基础教程(第三版)》第3章 建立数据库
![《Access基础教程(第三版)》第3章 建立数据库](https://img.taocdn.com/s3/m/d95c1119227916888486d783.png)
3.3 创建表
3.3.3 使用设计器创建表 相对前两种方法,使用设计器创建表更方便、 相对前两种方法,使用设计器创建表更方便、直观和易 于掌握,所以也是最常用的创建表的方法。 于掌握,所以也是最常用的创建表的方法。 在如图3.3所示的数据库窗口中,双击“使用设计器创 所示的数据库窗口中, 在如图 所示的数据库窗口中 双击“ 建表”则出现如图 所示的窗口, 建表”则出现如图3.7所示的窗口,在每一行中输入需要定 所示的窗口 义的字段名称,在数据类型列表框中选择所需的类型, 义的字段名称,在数据类型列表框中选择所需的类型,在说 明栏中输入对该字段的一些解释和注释信息, 明栏中输入对该字段的一些解释和注释信息,所输入的内容 将会显示在窗口的状态栏中。在窗口下方的“常规” 将会显示在窗口的状态栏中。在窗口下方的“常规”选项卡 中可以对字段的属性进行设置。 中可以对字段的属性进行设置。
3.4 字段类型和属性
9.必填字段 . 此属性值为“ 设置“ 此属性值为“是”或“否”项。设置“是”时,表示此字段值 必须输入,设置为“ 可以不填写本字段数据, 必须输入,设置为“否”时,可以不填写本字段数据,允许此字段 值为空。 值为空。 10. 10.允许空字符串 该属性仅用来设置文本字段,属性值也为“ 该属性仅用来设置文本字段,属性值也为“是”或“否”项, 设置为“ 表示该字段可以填写任何信息。 设置为“是”时,表示该字段可以填写任何信息。 11.索引 . 设置索引有利于对字段的查询、分组和排序, 设置索引有利于对字段的查询、分组和排序,此属性用于设置 单一字段索引。属性值有三种,一是“ 表示无索引; 单一字段索引。属性值有三种,一是“无”,表示无索引;二是 重复) 表示字段有索引,输入数据可以重复;三是“ “有(重复)”,表示字段有索引,输入数据可以重复;三是“有 无重复) 表示字段有索引,输入数据不可以重复。 (无重复)”,表示字段有索引,输入数据不可以重复。
3access字段属性
![3access字段属性](https://img.taocdn.com/s3/m/ff6415e9b8f67c1cfad6b895.png)
Access数据库基础知识——字段属性设计
文本和备注数据类型的自定义格式: <格式符号>;<字符串> 功能: “格式符号”用来定义文本字段的格式。 “字符串”用来定义字段是空串或是Null值时的字段格 Null 式。 格式符号 功能 @ 要求文本字符(字符或空格) & 不要求文本字符 < 使所有字母变为小写 > 使所有字母变为大写 ! 实施左对齐而不是右对齐
Access数据库基础知识——字段属性设计
是/否类型的格式:在Access中,是/否类型字段的 值保存的形式与预想的不同,“是”值用-1保存, “否”值用0保存。如果没有格式设定,则必须输入 -1表示“是”值;输入0表是“否”值,而且以这种 形式保存并显示。 自定义格式:;<真值>;<假值> 功能:设定“是/否”类型字段的显示格式。 日期/时间类型的格式:系统提供预定义和自定义两 种格式。 预定义格式见实例。 自定义格式符号见下表:
Access数据库基础知识——字段属性设计
符号 ;(冒号) / C D或dd ddd dddd ddddd dddddd W Ww m或mm 时间分隔符 日期分隔符 与常规日期的预定义格式相同 一个月中的日期用1位或2位数表示(1~31或01~31) 英文星期名称的前三个字母(Sun~Sat) 英文星期名称的全称(Sunday~Saturday) 与短日期的预定义格式相同 与长日期的预定义格式相同 一周中的日期(1~7) 一年中的周(1~53) 一年中的月份,用1位或2位数表示(1~12或01~12) 功能
Access数据库基础知识——字段属性设计 • 有效性规则和有效性文本(validationrule and validationtext):
MySQL字段完整性约束(重要)
![MySQL字段完整性约束(重要)](https://img.taocdn.com/s3/m/06b87b350622192e453610661ed9ad51f01d5490.png)
MySQL 字段完整性约束(重要)⽬录完整性约束(重要):主键,唯⼀标识,表都会拥有,不设置为默认找第⼀个 不空,唯⼀ 字段,未标识则创建隐藏字段:外键,外键要通过foreign key 语法建⽴表与表之间的关联:唯⼀性数据, 该条字段的值需要保证唯⼀,不能重复:⾃增,只能加给key 的int 类型字段,作为辅助修饰,⼀个表中只能设置⼀个⾃增字段:不为空 - 针对⼀些字段,如注册时的⽤户名,出⽣⼈的性别等,这些需求下的字段,只不能设置为Null ,必须要对其赋值:默认值 - 对有默认值意外的字段进⾏赋值时,有默认值的字段会被赋默认值:⽆符号 - 存储的数字从0开始: 0填充 - 存整数时数据长度⼩于取值范围长度,会在数字左⽅⽤0填充外键外键是 建⽴表与表关联 的字段,通常 ⼀个表的外键 是 另⼀个表的主键(唯⼀键也可以)多表关系⼀对⼀例如:丈夫-妻⼦,⽤户-⾝份证,作者-作者详情外键在任何⼀⽅都可以,此时外键要设置 唯⼀键没有级联关系:增加:先增加被关联表记录,再增加关联表记录删除:先删除关联表记录,再删除被关联表记录更新:关联与被关联表都⽆法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)primary key foreign key unique key auto_increment not null default unsigned zerofill # not null 与 default 限制# 不能为空,没有默认值的x ,必须赋值# y 、z 在没有赋值情况下,才有默认值,设置值后,采⽤默认值mysql>: create table td1 (x int not null, y int default 0, z int default 100);# 报错,auto_increment 必须设置给 键字段mysql>: create table td2 (x int auto_increment);# 报错,auto_increment 必须设置给 int 字段mysql>: create table td2 (x char(4) auto_increment);# 报错,auto_increment 字段最多出现 1次mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);# 正确,主键和唯⼀键分析# x 为主键:没有设置primary key 时,第⼀个 唯⼀⾃增键,会⾃动提升为主键mysql>: create table td21 (x int unique auto_increment, y int unique);# y 为主键:没有设置primary key 时,第⼀个 唯⼀⾃增键,会⾃动提升为主键mysql>: create table td22 (x int unique, y int unique auto_increment);# x 为主键:设置了主键就是设置的,主键没设置⾃增,那⾃增是可以设置在唯⼀键上的mysql>: create table td23 (x int primary key, y int unique auto_increment);# x 为主键:设置了主键就是设置的,主键设置了⾃增,⾃增字段只能有⼀个,所以唯⼀键不能再设置⾃增了mysql>: create table td24 (x int primary key auto_increment, y int unique);# 默认主键:没有设置主键,也没有 唯⼀⾃增键,那系统会默认添加⼀个 隐式主键(不可见)mysql>: create table td25 (x int unique, y int unique);# 唯⼀键:确保⼀个字段,数据不能重复# 主键:是⼀条记录的唯⼀标识(可以理解为数据的编号)# 联合唯⼀# ip 在port 不同时,可以相同,ip 不同时port 也可以相同,均合法# ip 和port 都相同时,就是重复数据,不合法mysql>: create table tu1 (ip char(16), port int, unique(ip, port));# 也可以设置成 联合主键,道理同 联合唯⼀mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));# sql 可以多⾏书写mysql>:create table t22(ip char(16),port int,primary key(ip,port));# 通常⾃增字段的 ⾃增索引 会被永久记录,想清空表并清空⾃增索引:mysql>: truncate 数据库名.表名1、外键的 字段名 可以⾃定义(名字随意),通常命名规范(关联表_关联字段)2、外键要通过 foreign key 语法建⽴表与表之间的关联mysql>: foreign key(所在表的外键字段) references 关联表(关联表已有字段)eg :foreign key(detail_id) references author_detail(id)3、级联关系(更新⼀起更新,删⼀起删)级联更新 on update cascade级联删除 on delete cascade# 重点:外键字段本⾝可以唯⼀或不唯⼀,但是外键字段必须唯⼀"""作者(author):id ,name ,sex ,age ,mobile作者详情(author_detail): id ,info ,address ,author_id"""## 建表# 作者详情(author_detail): id ,info ,address# 作者详情(author_detail): id,info,addresscreate table author_detail(id int primary key auto_increment,info char(50),address char(50));# 作者表(author): id,name,sex,age,mobile, detail_idcreate table author(id int primary key auto_increment,name char(10) not null,sex enum("男","⼥") default "男",age int not null,mobile char(13) unique key not null,detail_id int unique not null, # ⼀对⼀的表必须添加唯⼀键,并且类型和被关联的字段类型⼀致foreign key(detail_id) references author_detail(id) # 设置外键detail_id,是author_detail表中的字段id);## 插⼊# 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');mysql>: insert into author(name,age,mobile,detail_id) values('Tom',18,'133********', 1);## 修改(在被关联表中已被关联的记录不可以直接修改,关联表修改的前提是被关联表必须有⾄少⼀条记录没有被其他表关联)先修改关联表重新指向被关联表中新的记录。
python之数据库(字段的约束条件,表之间的关系)
![python之数据库(字段的约束条件,表之间的关系)](https://img.taocdn.com/s3/m/1a4db182dbef5ef7ba0d4a7302768e9951e76e81.png)
python之数据库(字段的约束条件,表之间的关系)10.6 约束条件10.61 not null 、defaultcreate table t15(id int,name char(16) not null,sex enum('male','female','other') not null default "male");#alter table t15 modify name char(16) not null;insert into t15(id,name) values(1,'egon1'),(2,'egon2'),(3,'egon3');mysql>desc t15;+-------+-------------------------------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+-------------------------------+------+-----+---------+-------+| id |int(11) | YES ||NULL||| name |char(16) | NO ||NULL||| sex | enum('male','female','other') | NO || male ||+-------+-------------------------------+------+-----+---------+-------+mysql>select*from t15;+------+-------+------+| id | name | sex |+------+-------+------+|1| egon1 | male ||2| egon2 | male ||3| egon3 | male |+------+-------+------+10.62 uniquemysql中存在⼀种专门的数据结构,叫 key,⼜称为索引,通过该数据结构可以减少 i/o 次数,从⽽加速查询效率 index key :只有加速查询的效果,没有约束的功能 unique key:不仅有加速查询的效果,还附加了⼀种约束的功能 primary key:不仅有加速查询的效果,还附加了⼀种约束的功能,并且innodb存储引擎会按照主键字段的值来组织表中所有的数据,所以⼀种inndob表中必须有、⽽且只能有⼀个主键,通常为该表的id字段unique:限制字段的值的唯⼀性,单从约束⾓度去看:唯⼀性约束#单列唯⼀create table t16(id int unique,name char(16));# 联合唯⼀(不能完全相同)create table server(id int unique,ip char(15),port int,unique(ip,port));mysql>desc server;+-------+----------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+----------+------+-----+---------+-------+| id |int(11) | YES | UNI |NULL||| ip |char(15) | YES | MUL |NULL||| port |int(11) | YES ||NULL||+-------+----------+------+-----+---------+-------+insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);mysql>select*from server;+------+---------+------+| id | ip | port |+------+---------+------+|1|1.1.1.1|3306||2|1.1.1.1|3307||3|1.1.1.2|3306|+------+---------+------+10.63 primary keyprimary key:单单从约束⾓度去看,primary key就等同于 not null + unique 强调: 1、⼀张表中必须有,并且只能有⼀个主键 2、⼀张表中都应该有⼀个id字段,⽽且应该把id字段做成主键create table t17(id int primary key,name char(16),age int,sex char(6))engine=innodb;#联合主键(不完全相同,但不能为空)create table t19(ip char(15),port int,primary key(ip,port));mysql>desc t19;+-------+----------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+----------+------+-----+---------+-------+| ip |char(15) | NO | PRI |||| port |int(11) | NO | PRI |0||+-------+----------+------+-----+---------+-------+10.64 auto_increment只能给被约束成key的字段加⾃增属性,默认起始位置是1,步长也为1# primary key auto_incrementcreate table t20(id int primary key auto_increment,name char(16))engine=innodb;mysql>insert t20(name) values('egon1');mysql>insert t20(name) values('egon2');mysql>select*from t20;+----+-------+| id | name |+----+-------+|1| egon1 ||2| egon2 |+----+-------+10.7 表关系10.71 多对⼀(foreign key)1、把所有数据都存放于⼀张表的弊端:表的组织结构复杂不清晰浪费空间扩展性极差2、寻找表与表之间的关系的⽅法:举例:emp表 dep表步骤⼀: part1: 1、先站在左表emp的⾓度 2、去找左表emp的多条记录能否对应右表dep的⼀条记录part2:1、站在右表dep的⾓度 2、去找右表dep的多条记录能否对应左表emp的⼀条记录 3、如何实现?在emp表中新增⼀个dep_id 字段,该字段指向dep表的id字段4、foreign key会带来什么样的效果?约束1:在创建表时,先建被关联的表dep,才能建关联表empcreate table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60));mysql>desc dep;+-------------+----------+------+-----+---------+----------------+| Field | Type |Null|Key|Default| Extra |+-------------+----------+------+-----+---------+----------------+| id |int(11) | NO | PRI |NULL| auto_increment || dep_name |char(10) | YES ||NULL||| dep_comment |char(60) | YES ||NULL||+-------------+----------+------+-----+---------+----------------+create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default'male',dep_id int,foreign key(dep_id) references dep(id));mysql>desc emp;+--------+-----------------------+------+-----+---------+----------------+| Field | Type |Null|Key|Default| Extra |+--------+-----------------------+------+-----+---------+----------------+| id |int(11) | NO | PRI |NULL| auto_increment || name |char(16) | YES ||NULL||| gender | enum('male','female') | NO || male ||| dep_id |int(11) | YES | MUL |NULL||+--------+-----------------------+------+-----+---------+----------------+约束2:在插⼊记录时,必须先插被关联的表dep,才能插关联表empinsert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','形象⼤使'),('nb技术部','nb技术能⼒有限部门');mysql>select*from dep;+----+-------------+-------------------------------------------+| id | dep_name | dep_comment |+----+-------------+-------------------------------------------+|1| sb教学部| sb辅导学⽣学习,教授python课程||2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+-------------+-------------------------------------------+insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);mysql>select*from emp;+----+---------+--------+--------+| id | name | gender | dep_id |+----+---------+--------+--------+|1| alex | male |1||2| egon | male |2||3| lxx | male |1||4| wxx | male |1||5| wenzhou | female |3|+----+---------+--------+--------+约束3:更新与删除都需要考虑到关联与被关联的关系(不能直接改变dep表的id) 解决⽅案:1、先删除关联表emp,再删除被关联表dep,准备重建mysql>drop table emp;mysql>drop table dep;2、重建:新增功能:同步更新,同步删除create table dep( #先建被参照的表id int primary key auto_increment,dep_name char(10),dep_comment char(60));create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default'male',dep_id int,foreign key(dep_id) references dep(id) on update cascade on delete cascade);insert into dep(dep_name,dep_comment) values('sb教学部','sb辅导学⽣学习,教授python课程'),('外交部','形象⼤使'),('nb技术部','nb技术能⼒有限部门');mysql>select*from dep;+----+------------------+------------------------------| id | dep_name | dep_comment |+----+------------------+------------------------------|1| sb教学部| sb辅导学⽣学习,教授python课程||2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+------------------+-------------------------------insert into emp(name,gender,dep_id) values('alex','male',1),('egon','male',2),('lxx','male',1),('wxx','male',1),('wenzhou','female',3);mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|1| alex | male |1||2| egon | male |2||3| lxx | male |1||4| wxx | male |1||5| wenzhou | female |3|+----+------------------+--------+--------+# 同步删除mysql>delete from dep where id=1;mysql>select*from dep;+----+------------------+------------------| id | dep_name | dep_comment |+----+------------------+------------------|2|外交部|形象⼤使||3| nb技术部| nb技术能⼒有限部门|+----+------------------+------------------mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|2| egon | male |2||5| wenzhou | female |3|+----+------------------+--------+--------+#同步更新mysql>update dep set id=200where id =2;mysql>select*from dep;+-----+------------------+----------------| id | dep_name | dep_comment |+-----+------------------+----------------|3| nb技术部| nb技术能⼒有限部||200|外交部|形象⼤使|+-----+------------------+----------------mysql>select*from emp;+----+------------------+--------+--------+| id | name | gender | dep_id |+----+------------------+--------+--------+|2| egon | male |200||5| wenzhou | female |3|+----+------------------+--------+--------+View Code10.72 多对多(foreign key)1、什么是多对多两张表之间是⼀个双向的多对⼀关系,称之为多对多2、如何实现?建⽴第三张表,该表中有⼀个字段是fk左表的id,还有⼀个字段是fk右表的idcreate table author(id int primary key auto_increment,name char(16));create table book(id int primary key auto_increment,bname char(16),price int);insert into author(name) values('egon'),('alex'),('wxx');mysql>select*from author;+----+------+| id | name |+----+------+|1| egon ||2| alex ||3| wxx |+----+------+insert into book(bname,price) values('python从⼊门到⼊⼟',200),('葵花宝典切割到精通',800),('九阴真经',500),('九阳神功',100);mysql>select*from book;+----+-----------------------------+-------+| id | bname | price |+----+-----------------------------+-------+|1| python从⼊门到⼊⼟|200||2|葵花宝典切割到精通|800||3|九阴真经|500||4|九阳神功|100|+----+-----------------------------+-------+create table author2book(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade); insert into author2book(author_id,book_id) values(1,3),(1,4),(2,2),(2,4),(3,1),(3,2),(3,3),(3,4);mysql>select*from author2book;+----+-----------+---------+| id | author_id | book_id |+----+-----------+---------+|1|1|3||2|1|4||3|2|2||4|2|4||5|3|1||6|3|2||7|3|3||8|3|4|+----+-----------+---------+10.73 ⼀对⼀(unique+foreign key)⼀对⼀:左表的⼀条记录唯⼀对应右表的⼀条记录,反之也⼀样create table customer( #先建被参照的表id int primary key auto_increment,name char(20) not null,qq char(10) not null,phone char(16) not null);create table student(id int primary key auto_increment,class_name char(20) not null,customer_id int unique, #该字段⼀定要是唯⼀的,⼀对⼀foreign key(customer_id) references customer(id) #外键的字段⼀定要保证unique on delete cascade on update cascade);insert into customer(name,qq,phone) values('李飞机','31811231',138********),('王⼤炮','123123123',152********),('守榴弹','283818181',1867141331),('吴坦克','283818181',1851143312),('赢⽕箭','888818181',1861243314),('战地雷','112312312',188********);mysql>select*from customer;+----+-----------+-----------+-------------+| id | name | qq | phone |+----+-----------+-----------+-------------+|1|李飞机|31811231|138********||2|王⼤炮|123123123|152********||3|守榴弹|283818181|1867141331||4|吴坦克|283818181|1851143312||5|赢⽕箭|888818181|1861243314||6|战地雷|112312312|188********|+----+-----------+-----------+-------------+insert into student(class_name,customer_id) values('python',3),('java',4),('c++',5);mysql>select*from student;+----+-------------+-------------+| id | class_name | customer_id |+----+-------------+-------------+|1| python |3||2| java |4||3| c++|5|+----+-------------+-------------+。
字段约束——精选推荐
![字段约束——精选推荐](https://img.taocdn.com/s3/m/4bf2ec5df6ec4afe04a1b0717fd5360cba1a8d19.png)
字段约束⽬录字段约束给主键添加约束,起到⾮空并且唯⼀的作⽤,主键指表⽰数据唯⼀性的字段,⼀张表中主键字段只有⼀个;字段约束/列约束 --> 约束: 限制主键约束主键主键约束:如果为⼀个列添加了主键约束,那么这个列就是主键,主键的特点是唯⼀且不能为空。
主键的作⽤: 作为⼀个唯⼀标识,唯⼀的表⽰⼀条表记录(作⽤类似于⼈的⾝份证号,可以唯⼀的表⽰⼀个⼈⼀样。
)关键字: primary key添加主键约束,例如将id设置为主键:create table stu(id int primary key,...);如果主键是数值类型,为了⽅便插⼊主键(并且保证插⼊数据时,主键不会因为重复⽽报错),可以设置⼀个主键⾃增策略。
主键⾃增主键⾃增策略是指:设置了⾃增策略的主键,可以在插⼊记录时,不给id赋值,只需要设置⼀个null值,数据库会⾃动为id分配⼀个值(AUTO_INCREMENT变量,默认从1开始,后⾯依次+1),这样既可以保证id是唯⼀的,也省去了设置id的⿇烦。
主键⾃增关键字: auto_increment例如: 将id主键设置为⾃增:create table stu(id int primary key auto_increment,...);⾮空约束⾮空约束:如果为⼀个列添加了⾮空约束,那么这个列的值就不能为空,但可以重复。
关键字: not null添加⾮空约束,例如为password添加⾮空约束:create table user(password varchar(50) not null,...);唯⼀约束唯⼀约束:如果为⼀个列添加了唯⼀约束,那么这个列的值就必须是唯⼀的(即不能重复),但可以为空。
关键字: unique添加唯⼀约束,例如为username添加唯⼀约束及⾮空约束:create table user(username varchar(50) unique not null,...);外键约束外键其实就是⽤于通知数据库两张表数据之间对应关系的这样⼀个列。
MySQL约束和数据类型
![MySQL约束和数据类型](https://img.taocdn.com/s3/m/41c7a6dfa0c7aa00b52acfc789eb172ded639998.png)
MySQL约束和数据类型约束条件约束条件就是在给字段加⼀些约束,使该字段存储的值更加符合我们的预期。
常⽤约束条件如下:UNSIGNED :⽆符号,值从0开始,⽆负数ZEROFILL:零填充,当数据的显⽰长度不够的时候,在数据前使⽤0填充⾄指定长度,字段会⾃动添加UNSIGNEDNOT NULL:⾮空约束,表⽰该字段的值不能为空DEFAULT:表⽰如果插⼊数据时没有给该字段赋值,那么就使⽤默认值PRIMARY KEY:主键约束,表⽰唯⼀标识,不能为空,且⼀个表只能有⼀个主键。
⼀般都是⽤来约束idAUTO_INCREMENT:⾃增长,只能⽤于数值列,⽽且配合索引使⽤,默认起始值从1开始,每次增长1UNIQUE KEY:唯⼀值,表⽰该字段下的值不能重复,null除外。
⽐如⾝份证号是⼀⼈⼀号的,⼀般都会⽤这个进⾏约束FOREIGN KEY:外键约束,某个表的字段是另⼀个表的主键,我们称这个字段为另⼀个表的外键。
⽬的是为了保证数据的完成性和唯⼀性,以及实现⼀对⼀或⼀对多关系MySQL数据类型MySQL⽀持多种类型的SQL数据类型:数值,⽇期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型等数据类型描述使⽤以下约定:M表⽰整数类型的最⼤显⽰宽度。
M表⽰整数类型的最⼤显⽰宽度。
对于浮点和定点类型, M是可以存储的总位数(精度)。
对于字符串类型,M是最⼤长度。
允许的最⼤值M取决于数据类型。
D适⽤于浮点和定点类型,并指⽰⼩数点后⾯的位数。
最⼤可能值为30,但不应⼤于 M-2。
[ ]表⽰类型定义的可选部分。
在MySQL中常⽤数据类型主要分为以下⼏类数值类型字符串类型⽇期时间类型1、数值类型数值类型包括整数型、浮点型、定点型1.1 整数型类型⼤⼩范围(有符号)范围(⽆符号)⽤途TINYINT 1 字节(-128,127)(0,255)⼩整数值SMALLINT 2 字节(-32 768,32 767)(0,65 535)⼤整数值MEDIUMINT 3 字节(-8 388 608,8 388 607)(0,16 777 215)⼤整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)⼤整数值BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极⼤整数值有符号表⽰数值可以为负数,⽆符号表⽰数值为⾮负数,如果不⼿动指定UNSIGNED,那么默认就是有符号的。
数据库字段的约束
![数据库字段的约束](https://img.taocdn.com/s3/m/a0eab95eff4733687e21af45b307e87100f6f857.png)
数据库字段的约束数据库中的约束我归纳了⼀下有⼏种据我所知道的列举出来数据库中的字段的约束很有哟个他可以对输⼊的内容及逆⾏⼀个规则为了防⽌以后忘了所以现在列举出来给⼤家和我⼀个参考1)主键约束(primary key)主键约束通常都是在id字段上使⽤的他⼜两个特点不能为空或不能重复,主键约束(primary key) 例如:create table 表名( uid number(20) primary key , uname varchar2(6) );2)⾮空约束(not null) ⾮空约束,就是保证⼀个字段不能为空,不能有空值存在,如果插⼊空值,则会报错。
3)唯⼀约束(unique) 如果想让某个字段唯⼀,则为它加上unique唯⼀约束,当插⼊了相同的值时会报错。
例如:create table 表名( uname varchar2(6) unique, uid number(10) primary keye );4)检查性约束(check (字段名 in (⼀个合法范围))) 使⽤检查性约束可以⽤来约束某个字段值的合法范围。
例如⽤1表⽰男,2表⽰⼥。
create table 表名( gender number(1) check (gender in(1,2)), );5)外键约束 外键约束⽤于两张表之间,⽤来保证关联数据的完整性。
例如订单和订单明细表,⼀对多关系。
创建订单表: create table 表名( order_id number(10), total_price number(10,2), ); 创建订单明细表: create table order_detail( detail_id number(10), order_id number(10),//在order表中是主键 item_name varchar2(10), quantity number(10), constraint order_detail_detail_id_pk primary key (detail_id), constraint order_detail_order_id_fk foreign key (order_id) referencs orders(order_id)|on deletecascade|on update cascade );6)⾃增(identity) identity⼀起使⽤的时候就会出现他可以去⾃动的增长不⽤你去⼈为的输⼊。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2.4 字段 列)约束和表约束 字段(列 约束和表约束
约束可以是字段(列)约束或表约束。 字段(列)约束被指定为字段(列)定义的一部分,并且仅适用于那个字 段(列)(前面的示例中的约束就是字段(列)约束)。 表约束的声明与列的定义无关,可以适用于表中一个以上的列。 当一个约束中必须包含一个以上的列时,必须使用表约束。 例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约 束将这两列加入主键内。假设有一个表记录了工厂内的一台计算机上所发 生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件 属于同一类型。这一点可以通过将 type 列和 time 列加入双列主键内来强 制执行。 DEFAULT(默认)约束和NULL(空)约束在第3.1节已经讲过了, FOREIGN KEY(外键) 约束将在第5章讨论。
3.1.2 精度和小数位数
精度显示该列值的最大数字个数。小数位数显示该列值小数 点右边能出现的最大数字个数。 数值列的精度是指选定数据类型所使用的最大位数。非数值 列的精度指最大列宽或定义的列宽。除 decimal 和 numeric 外, 其它数据类型的精度自动定义。如果要重新定义数值列的最大位 数,可以更改 decimal 和 numeric 数据类型的精度。不允许更改 不是这两种指定数据类型的列的精度。 numeric 或 decimal 列的小数位数是指该列值小数点右边能 出现的最大数字个数。在选定数据类型时,列的小数位数默认设 置为 0。对于包含近似浮点数的列,由于小数点右边的位数不固定, 故其小数位数并未定义。如果要重新定义小数点右边的位数,可 以更改 numeric 或 decimal 列的小数位数。
第3章 字段的属性和约束
除了第2章讲的字段的数据类型 之外,字段的域还包括属性和束。 3.1 字段的属性 3.2 约 束
3.1 字段的属性
字段除了前面已讨论的属性如:名称、数据 类型、为空性和数据长度之外,还具有默认值、 精度、小数位数,描述等属性。 3.1.1 默认值 3.1.2 精度和小数位数 3.1.3 标识、标识种子和标识递增量 3.1.4 ROWGUIDCOL 3.1.5 空 (NULL) 值
尽管 IDENTITY 属性自动为表生成行号,但不同表的标识符列可 以生成相同的行号。这是因为 IDENTITY 属性只须在所使用的表上保 持惟一即可。如果应用程序需要生成在整个数据库或世界各地所有网 络计算机的全部数据库中均为惟一的标识符列,应使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数。 可在每个表上创建一个全局惟一的标识符列。当必须对来自多个 数据库系统的相似数据进行合并时(例如,在包含位于世界各地分公司 的数据的客户帐单系统中),包含全局惟一值的列很有用。当数据汇集 到客户中心进行合并和制作报表时,使用全局惟一值可防止不同国家/ 地区的客户拥有相同的帐单号或客户 ID。 使用 ROWGUIDCOL 属性定义全局惟一标识符列时应注意; (1) 一个表只能有一个 ROWGUIDCOL 列,且该列必须定义为 uniqueidentifier 数据类型。 (2) SQL Server 不为该列自动生成值。若要插入全局惟一数值, 应为列创建 DEFAULT 定义,以使用 NEWID 功能生成全局惟一数值。
3.1.3 标识、标识种子和标识递增量 标识、
标识符列可实现自动编号。对任何表都可创建包含系统所生成序号值的 一个标识符列,该序号值惟一标识表中的一行。例如,当在客户表中插入行 时,标识符列可自动为应用程序产生惟一的客户ID值。标识符列在其所定义 的表中包含的数值通常是惟一的。这意味着在包含标识符列的其它表中可使 用与之相同的数值进行标识。 标识符列可用 IDENTITY 属性建立。 标识种子(Identity Seed)显示标识列的种子值。 标识递增量(Identity Increment)显示标识列的递增量值。 每个表中只能创建一个标识符列。 创建标识符列使应用程序开发人员得以对表中所插入的第一行指定标识 数字(Identity Seed 属性),并确定要添加到种子上的增量(Identity Increment 属性)以决定后面的标识数字。在向具有标识符列的表中插入值时,SQL Server 2000通过递增种子值的方法自动生成下一个标识值。 在用 IDENTITY 属性定义标识符列时应注意以下几点:
3.1.1 默认值
记录中的每一字段均必须有值,即使它是 NULL。可能会有这 种情况,当向表中装载新行时可能不知道某一字段的值,或该值 尚不存在。如果该字段的值允许空值,就可以将该字段赋予空值。 由于有时不希望有可为空的字段值,因此如果合适,更好的解决 办法可能是为该字段设置默认值。例如,通常将数字型的字段的 默认值指定为零,将字符串字段的默认值指定为暂缺。 由于在添加记录过程中,未输入某字段值时,可以使用字段默 认值把一个值自动加入到表字段中,因此也可以为字段中出现频 率最高的值定义默认值(即DEFAULT),这样新行被加入到该表中 时,用户就不必输入定义为DEFAULT字段的值了。例如,如果大 部分供应商都在北京,则可以为“供应商”表的“城市”字段设 置一个默认值“北京”。添加新记录时可以接受该默认值,也可 以键入新值覆盖它。 1. 在创建表时创建列的 DEFAULT 定义 2. 在现有表中创建列的 DEFAULT 定义 3. 将已有的列定义为DEFAULT 4. 创建 DEFAULT 对象
3.2 约
束
约束是自动强制数据库完整性的方式。它通过定义列中允许 值的规则,来维护数据的完整性。在SQL Server 2000 中常用的 约束有:
PRIMARY KEY(主键)约束 UNIQUE(惟一)约束 CHECK(检查)约束 DEFAULT(默认)约束 NOT NULL(非空)约束 FOREIGN KEY(外键)约束
3.2.2 UNIQUE约束 约束
可使用UNIQUE 约束确保在非主键列中不输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY约束都强制惟一性,但在强制下例中 的惟一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。 UNIQUE约束可用于以下列 (1)非主键的一列或列组合。 注意:一个表可以定义多个UNIQUE约束,而只能定义一个 PRIMARY KEY约束。 (2)允许空值的列。允许空值的列上可以定义 UNIQUE 约束,而 不能定义 PRIMARY KEY 约束。 1. 在创建表时创建 UNIQUE 约束 2. 在现有表中添加UNIQUE约束 3. 为已有的列定义UNIQUE 约束 4. 删除约束
3.2.1 3.2.2 3.2.3 3.2.4
PRIMARY KEY 约束 UNIQUE约束 CHECK约束 字段(列)约束和表约束
3.2.1 PRIMARY KEY 约束
表中经常有一个列或列的组合,其值能惟一地标识表中的 每一行。这样的一列或多列称为表的主键,通过它可强制表的 实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约 束来创建主键。 一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保 惟一数据,所以经常用来定义标识列。 1. 在创建表时创建 PRIMARY KEY 约束 2. 在现有表中添加 PRIMARY KEY 约束 3. 为已有的列定义PRIMARY KEY 约束 4. 删除约束
3.1.5 空 (NULL) 值
空值通常表示未知、不可用或将在以后添加的数据。空值或 NULL 并不等于零 (0)、空白或零长度的字符串(如""),NULL 意味 着没有输入。NULL 的存在通常表明值未知或未定义。例如, pubs 数据库 titles 表中 price 列的空值并不表示该书没有价格,而 是指其价格未知或尚未设定。 没有两个相等的空值。比较两个空值或将空值与任何其它数 值相比较均返回未知,这是因为每个空值均为未知。 如果插入某行但没有为允许空值的列包括值,则 SQL Server 为该列提供 NULL 值(除非存在 DEFAULT 定义或 DEFAULT 对 象)。用关键字 NULL 定义的列也接受用户的 NULL 显式输入,不 论它是何种数据类型或是否有默认值与之关联。NULL 值不应放在 引号内,否则会被解释为字符串NULL而不是空值。 指定一列不允许空值而确保行中一列永远包含数据可以保持 数据的完整性。因为如果不允许空值,则用户在向表中写数据时 必须在列中输入一个值,否则该行不会被接收到数据库。
一个表只能有一列定义为 IDENTITY 属性,而且该列必须以 decimal、 int、numeric、smallint、bigint 或 tinyint 数据类型定义。 可指定种子和增量值。二者的默认值均为 1。 标识符列不允许空值,也不能包含 DEFAULT 定义或对象。
3.1.4 ROWGUIDCOL
ቤተ መጻሕፍቲ ባይዱ
3.2.3 CHECK约束 约束
CHECK 约束通过限制输入到列中的值来强制域的完整性。这与 FOREIGN KEY 约束控制列中的数值相似。区别在于它们如何判断哪 些值有效:FOREIGN KEY 约束从另一个表中获得有效数值列表, CHECK 约束从逻辑表达式判断而非基于其它列的数据。 可以通过任何基于逻辑运算符返回结果 TRUE 或 FALSE 的逻辑 (布尔)表达式来创建 CHECK 约束。 对单独一列可使用多个 CHECK 约束,并按约束创建的顺序对其 取值。通过在表一级上创建 CHECK 约束,可以将该约束应用到多列 上。 1. 在创建表时创建 CHECK 约束 2. 在现有表中添加CHECK UNIQUE约束 3. 为已有的列定义CHECK 约束 4. 删除约束