数据库表约束
- 格式:docx
- 大小:17.61 KB
- 文档页数:7
postgresql----数据库表约束----NOTNULL,DEFAULT,CHECK 数据库表有NOT NULL,DEFAULT,CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY六种约束。
⼀、NOT NULL ---- ⾮空约束NULL表⽰没有数据,不表⽰具体的数值,所以在数据库中NULL是不等于NULL的。
判断表中的⼀个单元格是不是NULL使⽤的是IS NULL或者IS NOT NULL,⽽不是=NULL或者!=NULL,当⼀个字段设置NOT NULL约束后,INSERT时必须给该字段赋值,否则拒绝写⼊。
在⼀些程序语⾔(如C)查询结果中出现NULL有可能会直接作为空指针,如果使⽤不当,会直接导致程序崩溃。
所以⼀个字段要尽可能的设置NOT NULL约束,或者DEFAULT 约束,当然OUTER JOIN的结果也有可能引⼊NULL,所以开发过程中要尽可能的做好保护。
1.设置NOT NULL约束的字段INSERT必须赋值,没有NOT NULL约束的字段INSERT没有赋值,会⾃动填充NULL。
/*postgres=# create database test with template = template0 encoding='UTF8' lc_collate='C' lc_ctype='C';CREATE DATABASEpostgres=#postgres=#postgres=#postgres=# \c testYou are now connected to database "test" as user "postgres".test=# create table tbl_null (a int not null,b varchar(12));CREATE TABLEtest=# insert into tbl_null (a,b) values(1,'1');INSERT 0 1test=# insert into tbl_null (a) values(2);INSERT 0 1test=# insert into tbl_null (b) values('3');ERROR: null value in column "a" violates not-null constraintDETAIL: Failing row contains (null, 3).test=# select * from tbl_null;a | b---+---1 | 12 |(2 rows)*/2.NOT NULL约束增加已存在的字段设置NOT NULL约束前必须先删除为NULL的数据⾏。
简要介绍数据库表的约束和主要类型、作用
数据库表的约束是为了确保数据的完整性和一致性,限制对表的操作和数据的值。
主要的数据库表约束类型包括:
1. 主键约束(Primary Key Constraint):要求每条记录都具有
唯一标识,确保表中每行的数据唯一性。
主键可以由一个或多个字段组成。
2. 外键约束(Foreign Key Constraint):用于建立表之间的关联,确保参照关系的完整性。
外键字段指向相关表的主键字段。
3. 唯一约束(Unique Constraint):确保字段的值在表中是唯
一的,但可以为空。
一个表可以有多个唯一约束。
4. 非空约束(Not Null Constraint):确保指定的字段不允许为空值,要求必须为字段提供一个非空值。
5. 默认约束(Default Constraint):为字段定义一个默认值,
当插入数据时如果没有指定该字段的值,则自动使用默认值。
6. 检查约束(Check Constraint):定义字段的取值范围或条件,确保插入的数据满足指定的条件。
这些约束的作用是确保数据的完整性和一致性,防止无效数据的插入或更新。
它们可以帮助预防数据错误以及维护数据库的
数据质量。
同时,约束还可以提高查询和更新的效率,简化表之间的关联操作。
MySQL数据库的数据完整性与约束设置引言MySQL数据库是一种流行的关系型数据库管理系统,广泛应用于各种业务领域。
数据完整性是数据库的重要特性之一,它保证数据库中的数据能够符合预期的要求,有效地避免了数据的冗余和错误。
本文将探讨MySQL数据库中的数据完整性和约束设置,并介绍如何在数据库设计和操作中充分利用这些功能。
数据完整性的概念和意义数据完整性是指数据库中的数据满足各项约束条件,不出现意外的错误和矛盾。
它保证了数据的准确性和一致性,提高了数据处理的效率和可靠性。
数据完整性主要包括实体完整性、域完整性、参照完整性和用户自定义完整性等方面。
实体完整性是指数据库表中的每个记录都能够唯一地标识一个实体。
在MySQL中,可以通过定义主键来确保实体的唯一性。
主键是一列或多列组成的标识符,它可以用于唯一地标识每条记录,并保证表中不会出现重复的数据。
通过主键的使用,可以避免数据冗余和不一致的问题。
域完整性是指每个数据字段的值必须符合规定的域范围和约束条件。
在MySQL中,可以通过定义列的数据类型、长度和默认值等属性来保证域完整性。
例如,如果一个字段的数据类型为整数类型,那么它的值就只能是整数,而不能是字符串或其他类型的数据。
通过域完整性的设置,可以有效控制数据的类型和范围,避免了无效数据的存储。
参照完整性是指数据库中的外键和参照表之间的关联关系不能被破坏。
在MySQL中,可以通过定义外键来保证参照完整性。
外键是指一个表中的一个字段引用了另一个表中的字段,这样可以建立起两个表之间的关联关系。
通过外键的使用,可以防止无效的外键引用和关联表的数据不一致,确保数据的一致性和有效性。
用户自定义完整性是指根据具体业务需求,定义一些适合自己业务规则的完整性约束。
在MySQL中,可以通过定义触发器、存储过程和视图等对象来实现用户自定义完整性。
触发器可以在数据插入、更新或删除时触发一系列操作,从而对数据进行特定的验证和处理。
举例说明修改数据表字段,类型,约束的方法。
标题:深度解析:举例说明修改数据表字段、类型、约束的方法在数据库设计和管理中,修改数据表的字段、类型和约束是一项常见的操作。
在进行这些修改时,我们需要考虑到数据的完整性、准确性和效率。
在本文中,我们将深入探讨如何修改数据表的字段、类型和约束,并通过实际案例进行说明。
1.为什么需要修改数据表字段、类型、约束?数据表是数据库中存储数据的重要组成部分,而数据的结构和属性可能会随着业务需求的变化而改变。
我们需要不断对数据表进行修改,以保证数据的准确性和完整性。
2.修改字段名举例:假设我们有一个名为“学生”的数据表,其中包含一个字段名为“尊称”。
如果需要将该字段改为“学生尊称”,我们可以使用ALTER TABLE语句来修改字段名。
3.修改字段类型举例:在之前的“学生”表中,如果我们发现“学生尊称”的长度不够,我们可以使用ALTER TABLE语句来修改字段类型,例如将varchar(20)修改为varchar(50)。
4.修改字段约束举例:如果我们需要给“学生”表中的“学生尊称”字段添加唯一约束,我们可以使用ALTER TABLE语句来修改字段约束,例如添加UNIQUE约束。
5.个人观点和总结在实际的数据库管理中,我们经常需要面对修改数据表字段、类型和约束的需求。
通过本文的讲解和案例分析,我们可以更加深入理解如何通过SQL语句来实现这些修改操作。
合理的数据库设计和管理,需要我们不断学习和实践,才能更好满足业务需求。
通过本文的阅读,读者将能够深入了解如何通过SQL语句来修改数据表字段、类型和约束,从而更好进行数据库设计和管理。
希望本文能够帮助读者更好掌握这一重要的技能。
在数据库设计和管理中,修改数据表的字段、类型和约束是一项常见的操作。
这些修改操作需要经过谨慎的计划和执行,以确保数据的完整性和准确性。
在本文中,我们将进一步深入探讨各种修改操作的具体方法,并通过实际案例进行说明。
《数据库系统概论》实验报告题目:实验一 数据库和表数据库/表的基本操作和表级约束约束条件姓名 班级 学号 日期2010.9.29一. 实验内容和步骤结果1.在Student 数据库中,利用图形用户界面,创建一个选修了数据库课程并且是1986年出生的学生的视图,视图中包括学号,性别,成绩这三个信息:2.用两种不同的SQL 语句创建课本128页第11题中要求的视图(视图名:V_SPJ ) 方法一:CREATE VIEW V_SPJ ASSELECT SNO ,PNO ,QTY FROM SPJ WHERE JNO in( SELECT JNO FROM J 表WHERE JNAME ='三建')方法二:CREATE VIEW V_SPJASSELECT SNO,PNO,QTYFROM SPJ,J表WHERE SPJ.JNO=J表.JNO ANDJNAME='三建'3.用SQL语句完成课本128页第11题中对视图V_SPJ的查询(1)SELECT PNO,QTYFROM V_SPJ(2)SELECT PNO,QTY FROM V_SPJWHERE SNO='S1'4.用T-SQL语句操作视图的数据。
(15分,每题5分)(1) 给视图V_SPJ中增加一条数据(基本表中有插入的数据即可)。
INSERTINTO V_SPJVALUES('S0','P0','100')(2)修改视图V_SPJ中的任意一条数据的供应数量。
UPDATE V_SPJSET QTY=10WHERE SNO='S1'ANDPNO='P1'(3)删除视图V_SPJ中的任意一条数据。
DELETEFROM V_SPJWHERE SNO='S1';5.在图形用户界面中创建新登录名以及用户。
(20分,每题10分)(1)对于数据库company创建P148页第 8题中所需要用到的各个用户以及相关的关的登录名。
mysql数据库约束(constraint)-初学教程约束的⽬的:对表中的数据进⾏条件限制,保证表中的记录完整和有效性⾮空约束(not null)唯⼀性约束(unique)组合使⽤ not null 和 unique主键约束PK(primary key)外键约束FK(foreign key)级联更新与级联删除ps:创建表结构时,约束条件直接跟在字段后⾯的为列级约束,若约束条件是⽤括号时为表级约束。
使⽤表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复。
表级约束还可以给约束起名字,这样可以便于后期操作这个约束(如,删除⾮空约束(not null)作⽤:not null约束的字段不能为 NULL 值,必须赋具体数据;案例:创建t_user 表(id,name,email),name不为空> create table t_user(id int(10) ,name varchar(32) not null,email varchar(128));唯⼀性约束(unique)作⽤:unique约束的字段具有唯⼀性,不可重复,但是可以为空(null)。
案例:修改之前的t_user表结构,把email设置为唯⼀性> alter table t_user modify email varchar(128) unique;组合使⽤ not null 和 unique(表级约束)1,使⽤表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复,但是名字和邮箱字段可以单独重复。
2,可以给表级约束起名字,这样可以便于操作这个约束(如,删除,修改等)案例:给约束条件添加名字> show databases;> use information_schema;> show tables;table_constraints 该表专门存储约束信息查看某张表存在哪些约束条件?3,not null 和unique同时使⽤在列级约束作⽤:被 not null 和 unique 约束的字段,该字段即不能为 NULL 也不能重复;//发现添加数据时,name字段不能空也不能重复。
实验五约束默认和规则1、约束在数据库中的应用(1)用系统存储过程sp_helpconstraint查看student表的约束。
(2)在新建查询中输入插入一个学生信息的命令:insert into student(SNO,Sname,Sex,ClsNO,StuAddr,Birthday,Height)values('19920101','王军','男','CS01','下关#','1976.12.21',1.76),观察其结果。
修改SNO的值,将其值修改为’19000001’,其他的值保持不变,再插入一次,观察其结果。
(3)修改studeng表,使用Check约束,使性别列只能接受“男”或“女”,以强制执行域数据完整性。
重做(1),观察其结果。
(4)禁止student表中的sex列上的约束:alter table student nocheck constraint ck_student(5)删除约束:alter table student drop constraint ck_xsqk。
重做(1)。
(6)利用关系图,建立student表与course表与grade表的主外键约束。
2、默认的应用(1)创建默认对象:default_birthday,默认值为’1982-1-1’。
CREATE DEFAULT default_birthday AS ‘1982-01-01’(2)利用系统存储过程sp_bindefault将default_birthday绑定到student表的Birthday列上。
(3)利用系统存储过程sp_unbindefault解除student表的Birthday列上的默认值绑定。
(4)删除默认值:DROP DEFAULT default_birthday(5)定义一个默认值为4的Default_Value,并将它绑定到course表的Credit列上,绑定后给course插入数据行,观察默认值的设置情况,使用完毕后,解除并删除绑定。
表格约束条件-范文模板及概述示例1:表格约束条件是数据表中定义的一组规则,用于限制表中数据的插入、更新和删除操作。
这些约束条件有助于确保表的数据完整性和一致性,防止不正确或无效的数据进入表中。
在数据库设计和管理中,表格约束条件是至关重要的,可以提高数据质量,并减少数据操作错误的可能性。
常见的表格约束条件包括以下几种:1. 主键约束:主键是一列或一组列,用于唯一标识表中的每一行数据。
主键约束确保主键列中的值都是唯一且非空的,避免数据重复或缺失。
主键约束是表格中最重要的约束条件之一。
2. 唯一约束:唯一约束用于确保表中某一列或组合列的值是唯一的,但可以是空值。
唯一约束可以防止重复的数据出现在该列中,但允许空值的存在。
3. 非空约束:非空约束要求某一列不允许为空值,这意味着在插入或更新数据时,该列的值不能为null。
非空约束可以提高数据的完整性,并确保必要的数据不会缺失。
4. 默认约束:默认约束指定某一列的默认值,在插入新行时,如果未提供该列的值,则将使用默认值。
默认约束可以简化数据插入操作,并确保表中的数据满足特定要求。
5. 外键约束:外键约束用于定义表之间的关联关系,确保外键列中的值必须是另一个表的主键或唯一约束列的值。
外键约束可以维护表之间的数据一致性,并提供数据的引用完整性。
表格约束条件还可以包括复杂的约束条件,如检查约束、触发器等。
检查约束用于定义列中的数据必须满足的条件,触发器用于在表的数据插入、更新或删除时自动执行一些动作。
在设计数据库表格时,需要根据业务需求和数据的特性合理定义表格约束条件。
通过正确使用表格约束条件,可以有效地管理和维护表中的数据,提高数据质量和可靠性。
示例2:表格约束条件是指在数据库表中对特定字段值进行限制或规范的条件。
这些约束条件可以确保数据的一致性、完整性和准确性。
在数据库设计和管理中,使用表格约束条件可以有效地对数据进行验证和保护,从而提高数据的质量和可靠性。
常见的表格约束条件包括以下几种:1. 主键约束:主键是用来唯一标识表中每一行记录的字段或字段组合。
在数据库管理中,修改数据表字段、类型和约束是非常常见的操作,它们对于数据库的设计和维护起着重要作用。
在这篇文章中,我将深入探讨修改数据表字段、类型和约束的方法,并在深度和广度上进行全面评估,希望能够帮助您更全面、深入地理解这个主题。
1. 理解数据库表的基本结构在进行修改数据表的操作之前,首先需要对数据库表的基本结构有一定的了解。
一个数据表由多个字段组成,每个字段都有自己的数据类型和约束。
在修改数据表的过程中,需要考虑到这些字段之间的关系,以及对整个数据库系统的影响。
2. 修改数据表字段的方法当需要修改数据表中的某个字段时,可以通过ALTER TABLE语句来实现。
如果需要修改字段的数据类型,可以使用如下语句:```ALTER TABLE table_nameMODIFY column_name new_data_type;```如果需要修改字段的约束,可以使用如下语句:```ALTER TABLE table_nameADD CONSTR本人NT constr本人nt_name condition;```通过这些语句,可以灵活地修改数据表的字段和约束,以适应不同的需求。
3. 修改数据表类型的方法在实际的数据库管理过程中,有时候也需要修改整个数据表的类型,例如从InnoDB引擎切换到MyISAM引擎。
这时可以通过如下语句来实现:```ALTER TABLE table_nameENGINE = new_engine;```这样就可以轻松地修改数据表的类型,以适应不同的需求。
4. 举例说明举例来说,假设现在有一个名为“student”的数据表,其中有一个字段为“age”,数据类型为INT,需要将其修改为VARCHAR类型。
可以使用如下语句来实现:```ALTER TABLE studentMODIFY age VARCHAR(10);```通过这样的操作,就可以将“age”字段的数据类型从INT修改为VARCHAR,从而满足不同的需求。
创建“学生表”中的约束例 4:创建“学生表”中的约束(1)打开 SSMS窗口,在“对象资源管理器” 窗格中展开“数据库”,展开“ students ”,展开“表” 。
(2)右键单击“学生表” ,选择“设计”。
(3)右键单击“学号”行选择器,然后选择“设置主键”。
此时,学号列建立了主键约束,如图 3-5 所示。
图3-5“学生表”主键的添加( 4)右键单击“性别”列的行选择器,然后选择“对话框。
如图 3-6 所示。
CHECK约束”,弹出“CHECK约束”图 3-6学生表的CHECK约束对话框( 5)单击“添加”按钮,如果希望为约束指定一个不同的名称,请在“标识 -名称”框中键入名称。
单击“常规”→“表达式”栏目右侧的按钮,弹出“ CHECK约束表达式”对话框,在对话框中输入:性别 =’男’or 性别 ='女 ',如图 3-7 所示。
图 3-7 学生表性别字段的“ CHECK约束表达式”对话框(6)单击“确定”按钮,返回到CHECK约束对话框,如图 3-8 所示。
图 3-8学生表CHECK约束设置(7)接受缺省的约束名称。
(8)展开表设计器类别以设置在何时强制约束:若要在创建约束前对现有数据测试约束,请选中“在创建或启用时检查现有数据”。
若要每当复制代理对此表执行插入或更新操作时强制约束,请选中“强制用于复制”。
若要每当在此表中插入或更新行时强制约束,请选中“强制用于INSERT 和UPDATE”。
( 9)单击对话框底部的“关闭”按钮。
( 10)选择“工具栏”的“保存”按钮。
( 11)关闭表设计器。
附:使用 T-SQL代码创建“学生表”约束--添加主键约束ALTER TABLE学生表ADD CONSTRAINT PK_学生表PRIMARY KEY CLUSTERED学号( )GO--添加 CHECK约束ALTER TABLE学生表ADD CONSTRAINT CK_学生表CHECK (性别 ='男 ' OR 性别 ='女 ')GO例 5:创建“课程表“中的约束(1)打开 SSMS窗口,在“对象资源管理器” 窗格中展开“数据库”,展开“ students ”,展开“表”。
数据库中的五种约束及其添加⽅法数据库中的五种约束及其添加⽅法五⼤约束1.—-主键约束(Primay Key Coustraint)唯⼀性,⾮空性2.—-唯⼀约束(Unique Counstraint)唯⼀性,可以空,但只能有⼀个3.—-检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)4.—-默认约束 (Default Counstraint) 该数据的默认值5.—-外键约束(Foreign Key Counstraint)需要建⽴两表间的关系并引⽤主表的列五⼤约束的语法⽰例1.—-添加主键约束(将stuNo作为主键)alter tablestuInfoadd constraint PK_stuNo primary key(stuNo)2.—-添加唯⼀约束(⾝份证号唯⼀,因为每个⼈的都不⼀样)alter table stuInfoaddconstraint UQ_stuID unique(stuID)3.—-添加默认约束(如果地址不填默认为“地址不详”)altertable stuInfoadd constraint DF_stuAddress default (‘地址不详’) forstuAddress4.—-添加检查约束(对年龄加以限定 15-40岁之间)alter table stuInfoaddconstraint CK_stuAge check (stuAge between 15 and 40)alter tablestuInfoadd constraint CK_stuSex check (stuSex=’男’ orstuSex=’⼥′)5.—-添加外键约束 (主表stuInfo和从表stuMarks建⽴关系,关联字段stuNo)alter tablestuInfoadd constraint FK_stuNo foreign key(stuNo)referencesstuinfo(stuNo)约束(Constraint)是Microsoft SQL Server提供的⾃动保持数据库完整性的⼀种⽅法,定义了可输⼊表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。
数据库关系模型的三类完整性约束关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,⽤户定义完整性实体完整性定义:实体完整性是⽤于保证关系数据库中每个元组都是可区分的,唯⼀的。
它的意思就是说数据表中每⼀⾏都应该有办法将其唯⼀区分开来,这⾃然指的就是主键了,⽽且主键必须不能为空或部分为空。
那么它⼤可以直接叫⼀些诸如“要有主键”等通俗的名字,但是为何要叫实体完整性呢?⾸先第⼀点,“实体完整性”这个名字听起来就很⾼⼤上,嘿嘿;好了不开玩笑了,说认真的。
⼀个基本表实际上是对应了现实⽣活中的⼀个实体集的,⽐如学⽣关系就对应了学⽣的集合,因此我们所谓的表,其实就相当于现实⽣活中的某⼀种实体的集合。
⽽现实⽣活中的实体都是可以唯⼀区分的,他们本⾝就都具有了某种唯⼀性标识,⽐如学⽣的学号,⼈的⾝份证等等。
所以既然我们的表是相对于实体集的,那么表中必然需要⼀个主键来作为这个实体在被抽象后的唯⼀标识⽽主键不能为空就更好理解了,主键要是为空了那还拿什么来唯⼀标识这个实体呢?即这样就会存在不可区分的实体了,那就和我们上⾯讲的⽭盾了。
因此,这个规则就叫做实体完整性,私下⾥(不正式啊,只是辅助理解与记忆)可以理解为主键完整性。
参照完整性参照完整性中的参照,说⽩了就是数据表⾥的外键。
举个例⼦,下⾯有三个关系:学⽣(学号,姓名)课程(课程号,课程名)选修(学号,课程号,成绩)显然,在选修关系中的学号,必须是学⽣表⾥真正存在的学号,且选修表⾥的课程号,也必须是课程表⾥真正存在的课程号。
这就是参照完整性的⼀个典型表现了。
在上⾯的例⼦中,选修表中的学号就称为选修表的⼀个外码,它对应的是学⽣表中的学号。
并且称选修关系为参照关系,⽽学⽣关系为被参照关系。
但是仅仅这么说还有很多细节没有讲到,下⾯我们理⼀理外码的定义。
⾸先要知道,外码不能是这个关系(参照关系)的主码,但是是它参照的关系(被参照关系)的主码。
什么意思呢,就是说学号这个属性在学⽣表中是主码,⽽在选修表中不是,这就称学号是选修表中的⼀个外键(课程号同理)。
表格约束条件全文共四篇示例,供读者参考第一篇示例:表格约束条件是数据表中存储数据时需要遵守的规则或限制,它能够确保数据的完整性、准确性和一致性。
在数据库管理系统中,表格约束条件是非常重要的,它可以帮助用户避免错误或重复数据的输入,保护数据的完整性。
表格约束条件可以分为多种类型,包括主键约束、唯一约束、外键约束、非空约束、默认值约束等。
每一种约束条件都有不同的作用和作用范围,可以根据需求来选择使用哪种约束条件。
主键约束是表格中的一个或多个列,该列的值能够唯一标识表中的每一行数据。
主键约束可以确保数据的唯一性,避免重复数据的输入。
唯一约束与主键约束类似,但是唯一约束允许列中的值可以为空,而主键约束不允许列中的值为空。
外键约束用来建立表格之间的关系,它能够确保引用表中的值在被引用表中存在。
外键约束可以用来维护表格之间的一致性,确保数据库中的数据一致性和完整性。
非空约束用来确保表格中某一列的值不能为空,可以避免空值的输入。
默认值约束可以设置某一列的默认值,当用户没有输入值时,系统会自动填充默认值。
第二篇示例:表格约束条件是数据库设计的重要组成部分,用于确保数据库表的数据完整性和一致性。
在数据库中,表格约束条件是一组规则,用于限制对表格中数据的插入、更新和删除操作,以防止不符合要求的数据被输入或修改。
常见的表格约束条件包括主键约束、外键约束、唯一约束、检查约束和默认约束等。
这些约束条件可以帮助数据库管理员和开发人员在设计数据库时规范数据的输入和维护,减少数据错误和冗余,提高数据的质量和可靠性。
主键约束是表格中的一列或一组列,其值用于唯一标识每一行数据。
主键约束要求这些值在表格中是唯一的,并且不允许为空。
主键约束可以帮助确保数据的唯一性,避免重复记录的插入,提高数据查询的效率。
外键约束是用于建立表格之间关系的约束条件。
外键约束要求一个表格的某列值必须在另一个表格的主键列中存在,以确保数据的一致性和完整性。
外键约束可以帮助实现表格之间的关联查询和数据关系的维护。
实验六数据完整性约束姓名:学号:专业:网络工程班级:20网络工程同组人:无实验日期:2022.5【实验目的与要求】1.熟练掌握实体完整性的实现。
2.熟练掌握参照完整性的实现。
3.熟练掌握域完整性的实现。
【实验内容与步骤】实验准备:(1)对于SalesDB数据库,若在产品表、销售表和客户表上已有约束,请先删除之;(2)删除掉表中重复的行。
6.1.实体完整性的实现(1) 对产品表,定义主键约束(用企业管理器实现)。
写出相应过程:(1)在对象资源管理器中的数据库节点下找到数据库SalesDB,找到表Product。
右击-修改(2)按住Ctrl键选中Price和Stocks,右键-设置主键-保存测试:试着对产品表插入一条与原表中数据行具有相同主键值的数据。
给出测试结果:(2)客户表(CUSTOMER),定义名为PK_Cstm的主键约束,设定客户号(Cno)为主键。
(用SQL语句实现,写出相应语句)。
给出相应的SQL语句:alter table Customeraddconstraint PK_Cstm primary key(Cno)给出测试结果:(3)对销售表,定义名为PK_Sales的主键约束,设定主键为(Pno,Cno)的组合(用SQL语句实现,写出相应语句)。
给出相应的SQL语句:alter table Salesaddconstraint PK_Sales primary key(Pno,Cno)给出测试结果:(1)利用企业管理器建立产品表(Product)与销售表(Sales)之间的参照关系,当对主表产品表进行更新和删除操作时,从表Sales采用NO ACTION方式,写出其过程。
给出相应的过程:测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,给出测试结果。
(2)利用SQL语句建立销售表(SALES)与客户表(CUSTOMER)之间的参照关系,设定外键约束名为FK_SC,使得当对主表客户表(CUSTOMER)进行更新和删除操作时,从表销售表(SALES)采用CASCADE(级联)方式处理,给出相应的SQL语句和测试结果。
[MySQL数据库之表的约束条件:primarykey、auto_increment、no。
[MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建⽴关联]表的约束条件约束条件与数据类型的宽度⼀样,都是可选参数作⽤:⽤于保证数据的完整性和⼀致性主要分为:PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯⼀的标识记录FOREIGN KEY (FK) 标识该字段为该表的外键NOT NULL 标识该字段不能为空UNIQUE KEY (UK) 标识该字段的值是唯⼀的AUTO_INCREMENT 标识该字段的值⾃动增长(整数类型,⽽且为主键)DEFAULT 为该字段设置默认值UNSIGNED ⽆符号ZEROFILL 使⽤0填充说明:1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值2. 字段是否有默认值,缺省的默认值是NULL,如果插⼊记录时不给字段赋值,此字段使⽤默认值sex enum('male','female') not null default 'male'age int unsigned NOT NULL default 20 必须为正值(⽆符号)不允许为空默认是203. 是否是key主键 primary key外键 foreign key索引 (index,unique...)primary key从约束⾓度看primary key字段的值不为空且唯⼀主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,⼀张表中必须有且只有⼀个主键。
⼀个表中可以:单列做主键多列做主键(复合主键)主键通常都是id字段:对于以后建的表都是innodb存储引擎的,在建表的时候⼀定要有id,id⼀定得是主键create table t3(id int primary key);insert t3 values(1);联合主键(了解)create table t5(id int,name varchar(10),primary key(id,name));insert t5 values(1,"egon"); -- 正常插⼊insert t5 values(1,"tom"); -- 正常插⼊insert t5 values(1,"egon"); -- 重复,报错auto_increment约束字段为⾃动增长,被约束的字段必须同时被key约束create table t6(id int primary key auto_increment,name varchar(16));insert t6(name) values("geng"); -- 给name插⼊值insert t6(name) values("yang"); -- 给name插⼊值insert t6(name) values("sun"); -- 给name插⼊值not null与default是否可空,null表⽰空,⾮字符串not null - 不可空null - 可空default - 默认值,创建列时可以指定默认值,当插⼊数据时如果未主动设置,则⾃动添加默认值设置id字段有默认值后,则⽆论id字段是null还是not null,都可以插⼊空,插⼊空默认填⼊default指定的默认值create table t7(id int not null,name varchar(16));insert t7 values(null,"geng");create table t8(id int not null default 0,name varchar(16));insert t8(name) values("geng");uniqueunique设置唯⼀约束,不允许重复create table t9(id int unique,name varchar(16));insert t9 values(1,"geng");insert t9 values(1,"yang"); -- 报错id重复补充知识:not null+unique的化学反应create table t10(id int not null unique,name varchar(16));id 字段变成了主键:不为空且唯⼀mysql> create table t10(-> id int not null unique,-> name varchar(16)-> );Query OK, 0 rows affected (0.24 sec)mysql> desc t10;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || name | varchar(16) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+2 rows in set (0.02 sec)foreign key员⼯信息表有三个字段:⼯号姓名部门公司有3个部门,但是有1个亿的员⼯,那意味着部门这个字段需要重复存储,部门名字越长,越浪费解决⽅法:我们完全可以定义⼀个部门表然后让员⼯信息表关联该表,如何关联,即foreign key表与表之间建⽴关联多对⼀关系创建表时需要先建⽴被关联表create table dep(id int primary key auto_increment,name varchar(20),comment varchar(50));再创建关联表(同步更新,同步删除)create table emp(id int primary key auto_increment,name varchar(16),age int,dep_id int,foreign key(dep_id) references dep(id)on update cascadeon delete cascade);插⼊数据时,应该先往dep插⼊数据,再往emp插⼊数据insert dep(name,comment) values("IT","搞技术"),("sale","卖东西"),("HR","招聘");insert emp(name,age,dep_id) values("egon",18,1),("tom",19,2),("lili",28,2),("jack",38,1),("lxx",78,3);》》加了foreign key之后级联更新级联删除会带来额外的效果更新dep,emp中对应的数据跟着改update dep set id=33 where name ="HR";删除dep,emp中对应的数据跟着删除delete from dep where id=2;# 删除dep表中的id为2的销售部门,emp表中对应dep销售部门的员⼯也跟着删除了mysql> delete from dep where id=2;Query OK, 1 row affected (0.23 sec)mysql> select * from dep;+----+------+-----------+| id | name | comment |+----+------+-----------+| 1 | IT | 搞技术 || 33 | HR | 招聘 |+----+------+-----------+2 rows in set (0.00 sec)mysql> select * from emp;+----+------+------+--------+| id | name | age | dep_id |+----+------+------+--------+| 1 | egon | 18 | 1 || 4 | jack | 38 | 1 || 5 | lxx | 78 | 33 |+----+------+------+--------+3 rows in set (0.00 sec)多对多关系egon 九阳神功egon 祥龙⼗⼋掌egon 易筋经egon 九阴真经egon 葵花宝典jason 九阳神功jason 祥龙⼗⼋掌lxx 易筋经lxx 九阴真经hxx 祥龙⼗⼋掌hxx 易筋经hxx 九阴真经# 多个作者编写⼀本书# ⼀个作者编写多本书create table author(id int primary key auto_increment,name varchar(16));create table book(id int primary key auto_increment,name varchar(20));create author2book(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id)on update cascadeon delete cascade,foreign key(book_id) references book(id)on update cascadeon delete cascade);⼀对⼀关系#⼀定是student来foreign key表customer,这样就保证了:#1 学⽣⼀定是⼀个客户,#2 客户不⼀定是学⽣,但有可能成为⼀个学⽣create table customer(id int primary key auto_increment,name varchar(20) not null,qq varchar(10) not null,phone char(16) not null);create table student(id int primary key auto_increment,class_name varchar(20) not null,customer_id int unique, # 该字段⼀定要是唯⼀的foreign key(customer_id) references customer(id) # 外键的字段⼀定要保证unique on delete cascadeon update cascade);# 增加客户insert into customer(name,qq,phone) values('蔡⼦奇','31811231',138********),('孙宗伟','123123123',152********),('胡⽟康','283818181',1867141331),('刘洋','283818181',1851143312),('杨逸轩','888818181',1861243314),('杨杰','112312312',188********);# 增加学⽣insert into student(class_name,customer_id) values('⽜逼1班',3),('装逼2班',4),('装逼2班',5);如何找出两张表之间的关系>>分析步骤:1、先站在左表的⾓度去找是否左表的多条记录可以对应右表的⼀条记录,如果是,则证明左表的⼀个字段foreign key 右表⼀个字段(通常是id)2、再站在右表的⾓度去找是否右表的多条记录可以对应左表的⼀条记录,如果是,则证明右表的⼀个字段foreign key 左表⼀个字段(通常是id)3、总结:# 多对⼀:如果只有步骤1成⽴,则是左表多对⼀右表如果只有步骤2成⽴,则是右表多对⼀左表# 多对多如果步骤1和2同时成⽴,则证明这两张表时⼀个双向的多对⼀,即多对多,需要定义⼀个这两张表的关系表来专门存放⼆者的关系# ⼀对⼀:如果1和2都不成⽴,⽽是左表的⼀条记录唯⼀对应右表的⼀条记录,反之亦然。
SQL表约束约束数据类型是限制我们可以在表里存储什么数据的一种方法。
不过,对于许多应用来说,这种限制实在是太粗糙了。
比如,一个包含产品价格的字段应该只接受正数。
但是没有哪种标准数据类型只接受正数。
另外一个问题是你可能需要根据其它字段或者其它行的数据来约束字段数据。
比如,在一个包含产品信息的表中,每个产品编号都应该只有一行。
对于这些问题,SQL 允许你在字段和表上定义约束。
约束允许你对数据施加任意控制。
如果用户企图在字段里存储违反约束的数据,那么就会抛出一个错误。
这种情况同时也适用于数值来自缺省值的情况。
5.3.1. 检查约束检查约束是最常见的约束类型。
它允许你声明在某个字段里的数值必须使一个布尔表达式为真。
比如,要强制一个正数的产品价格,你可以用:CREATE TABLE products (product_no integer,name text,price numeric CHECK (price > 0));如你所见,约束定义在数据类型之后,就好像缺省值定义一样。
缺省值和约束可以按任意顺序排列。
一个检查约束由一个关键字CHECK 后面跟一个放在圆括弧里的表达式组成。
检查约束表达式应该包含受约束的字段,否则这个约束就没什么意义了。
你还可以给这个约束取一个独立的名字。
这样就可以令错误信息更清晰,并且在你需要修改它的时候引用这个名字。
语法是:CREATE TABLE products (product_no integer,name text,price numeric CONSTRAINT positive_price CHECK (price > 0));因此,要声明一个命名约束,使用关键字CONSTRAINT 后面跟一个标识符(作为名字),然后再跟约束定义。
如果你不用这个方法声明约束,那么系统会自动为你选择一个名字。
一个检查约束也可以引用多个字段。
假设你存储一个正常价格和一个折扣价,并且你想保证折扣价比正常价低。
CREATE TABLE products (product_no integer,name text,price numeric CHECK (price > 0),discounted_price numeric CHECK (discounted_price > 0),CHECK (price > discounted_price));头两个约束看上去很面熟。
第三个使用了一个新的语法。
它没有附着在某个字段上,而是在逗号分隔的字段列表中以一个独立行的形式出现。
字段定义和约束定义可以按照任意顺序列出。
我们称头两个约束是"字段约束",而第三个约束是"表约束"(和字段定义分开写)。
字段约束也可以写成表约束,而反过来很可能不行,因为系统假设字段约束只引用它所从属的字段。
PostgreSQL 并不强制这条规则,但是如果你希望自己的表定义可以和其它数据库系统兼容,那么你最好还是遵循这条规则。
上面的例子也可以这么写:CREATE TABLE products (product_no integer,name text,price numeric,CHECK (price > 0),discounted_price numeric,CHECK (discounted_price > 0),CHECK (price > discounted_price));或者是CREATE TABLE products (product_no integer,name text,price numeric CHECK (price > 0),discounted_price numeric,CHECK (discounted_price > 0 AND price > discounted_price));这只是风格的不同。
和字段约束一样,我们也可以给表约束赋予名称,方法也相同:CREATE TABLE products (product_no integer,name text,price numeric,CHECK (price > 0),discounted_price numeric,CHECK (discounted_price > 0),CONSTRAINT valid_discount CHECK (price > discounted_price));我们还要注意的是,当约束表达式计算结果为NULL 的时候,检查约束会被认为是满足条件的。
因为大多数表达式在含有NULL 操作数的时候结果都是NULL ,所以这些约束不能阻止字段值为NULL 。
要确保一个字段值不为NULL ,可以使用下一节介绍的非空约束。
5.3.2. 非空约束非空约束只是简单地声明一个字段必须不能是NULL 。
下面是一个例子:CREATE TABLE products (product_no integer NOT NULL,name text NOT NULL,price numeric);一个非空约束总是写成一个字段约束。
非空约束在功能上等效于创建一个检查约束CHECK (column_name IS NOT NULL) ,但在PostgreSQL 里,创建一个明确的非空约束效率更高。
缺点是你不能给它一个明确的名字。
当然,一个字段可以有多个约束。
只要一个接着一个写就可以了:CREATE TABLE products (product_no integer NOT NULL,name text NOT NULL,price numeric NOT NULL CHECK (price > 0));它们的顺序无所谓。
顺序并不影响约束检查的顺序。
NOT NULL 约束有个相反的约束:NULL 约束。
它并不意味着该字段必须是空,因为这样的字段也没用。
它只是定义了该字段可以为空的这个缺省行为。
在SQL 标准里没有定义NULL 约束,因此不应该在可移植的应用中使用它。
在PostgreSQL 里面增加这个约束只是为了和其它数据库系统兼容。
不过,有些用户喜欢它,因为这个约束可以让他们很容易在脚本文件里切换约束。
比如,你可以从下面这样开始CREATE TABLE products (product_no integer NULL,name text NULL,price numeric NULL);然后在需要的时候插入NOT 关键字。
【提示】在大多数数据库设计里,主要的字段都应该标记为非空。
5.3.3. 唯一约束唯一约束保证在一个字段或者一组字段里的数据与表中其它行的数据相比是唯一的。
它的语法是:CREATE TABLE products (product_no integer UNIQUE,name text,price numeric);上面是写成字段约束,下面这个则写成表约束:CREATE TABLE products (product_no integer,name text,price numeric,UNIQUE (product_no));如果一个唯一约束引用一组字段,那么这些字段用逗号分隔列出:CREATE TABLE example (a integer,b integer,c integer,UNIQUE (a, c));这样就声明了特定字段值的组合在整个表范围内是唯一的。
但是这些字段中的某个单独值可以不必是(并且通常也确实不是)唯一的。
你也可以给唯一约束赋予一个自己定义的名字,方法与前面相同:CREATE TABLE products (product_no integer CONSTRAINT must_be_different UNIQUE,name text,price numeric);通常,如果包含在唯一约束中的那几个字段在表中有多个相同的行,就违反了唯一约束。
但是在这种比较中,NULL 被认为是不相等的。
这就意味着,在多字段唯一约束的情况下,如果在至少一个字段上出现NULL ,那么我们还是可以存储同样的这种数据行。
这种行为遵循SQL 标准,但是我们听说其它SQL 数据库可能不遵循这个标准。
因此如果你要开发可移植的程序,那么最好仔细些。
5.3.4. 主键从技术上讲,主键约束只是唯一约束和非空约束的组合。
所以,下面两个表定义是等价的:CREATE TABLE products (product_no integer UNIQUE NOT NULL,name text,price numeric);CREATE TABLE products (product_no integer PRIMARY KEY,name text,price numeric);主键也可以约束多于一个字段;其语法类似于唯一约束:CREATE TABLE example (a integer,b integer,c integer,PRIMARY KEY (a, c));主键表示一个或多个字段的组合可以用于唯一标识表中的数据行。
这是定义一个主键的直接结果。
请注意:一个唯一约束实际上并不能提供一个唯一标识,因为它不排除NULL 。
这个功能对文档目的和客户应用都很有用。
比如,一个可以修改行数值的GUI 应用可能需要知道一个表的主键才能唯一地标识每一行。
一个表最多可以有一个主键(但是它可以有多个唯一和非空约束)。
关系型数据库理论告诉我们,每个表都必须有一个主键。
PostgreSQL 并不强制这个规则,但我们最好还是遵循它。
5.3.5. 外键外键约束声明一个字段(或者一组字段)的数值必须匹配另外一个表中出现的数值。
我们把这个行为称为两个相关表之间的参照完整性。
假设你有个产品表,我们可能使用了好几次:CREATE TABLE products (product_no integer PRIMARY KEY,name text,price numeric);假设你有一个存储这些产品的订单的表。
我们想保证订单表只包含实际存在的产品。
因此我们在订单表中定义一个外键约束引用产品表:CREATE TABLE orders (order_id integer PRIMARY KEY,product_no integer REFERENCES products (product_no),quantity integer);现在,我们不能创建任何其product_no 没有在产品表中出现的订单。
在这种情况下我们把订单表叫做引用表,而产品表叫做被引用表。
同样,也有引用字段和被引用字段。