MYSQL中约束
mysql约束面试题

mysql约束面试题
MySQL约束是用于确保数据完整性的重要工具。
以下是一些关于MySQL约束的面试题:
1. 什么是约束?为什么我们需要约束?
2. 在MySQL中,有哪些常见的约束类型?
3. 解释主键约束(PRIMARY KEY)的作用和特点。
4. 解释唯一约束(UNIQUE)的作用和特点。
5. 解释外键约束(FOREIGN KEY)的作用和特点。
6. 解释非空约束(NOT NULL)的作用和特点。
7. 解释检查约束(CHECK)的作用和特点(注意:MySQL在某些版本中可能不支持检查约束)。
8. 如何为表中的列设置默认值?
9. 如何在创建表时使用多个约束?
10. 如何查看表的约束信息?
11. 如果违反了约束条件,MySQL会抛出什么类型的错误?
12. 如何删除一个约束?
13. 在使用外键约束时,需要注意哪些问题?
14. 在设计数据库时,应该如何选择使用哪些约束?
15. 在某些情况下,可能会遇到外键删除受限的问题,如何解决?
16. 在MySQL中,是否可以设置复合主键?如果是,请解释什么是复合主键。
17. 解释触发器(Trigger)的作用和特点,以及它与约束的区别。
以上问题可以帮助你了解应聘者对MySQL约束的理解和掌握程度。
MySQL数据库的数据完整性与约束设置

MySQL数据库的数据完整性与约束设置引言MySQL数据库是一种流行的关系型数据库管理系统,广泛应用于各种业务领域。
数据完整性是数据库的重要特性之一,它保证数据库中的数据能够符合预期的要求,有效地避免了数据的冗余和错误。
本文将探讨MySQL数据库中的数据完整性和约束设置,并介绍如何在数据库设计和操作中充分利用这些功能。
数据完整性的概念和意义数据完整性是指数据库中的数据满足各项约束条件,不出现意外的错误和矛盾。
它保证了数据的准确性和一致性,提高了数据处理的效率和可靠性。
数据完整性主要包括实体完整性、域完整性、参照完整性和用户自定义完整性等方面。
实体完整性是指数据库表中的每个记录都能够唯一地标识一个实体。
在MySQL中,可以通过定义主键来确保实体的唯一性。
主键是一列或多列组成的标识符,它可以用于唯一地标识每条记录,并保证表中不会出现重复的数据。
通过主键的使用,可以避免数据冗余和不一致的问题。
域完整性是指每个数据字段的值必须符合规定的域范围和约束条件。
在MySQL中,可以通过定义列的数据类型、长度和默认值等属性来保证域完整性。
例如,如果一个字段的数据类型为整数类型,那么它的值就只能是整数,而不能是字符串或其他类型的数据。
通过域完整性的设置,可以有效控制数据的类型和范围,避免了无效数据的存储。
参照完整性是指数据库中的外键和参照表之间的关联关系不能被破坏。
在MySQL中,可以通过定义外键来保证参照完整性。
外键是指一个表中的一个字段引用了另一个表中的字段,这样可以建立起两个表之间的关联关系。
通过外键的使用,可以防止无效的外键引用和关联表的数据不一致,确保数据的一致性和有效性。
用户自定义完整性是指根据具体业务需求,定义一些适合自己业务规则的完整性约束。
在MySQL中,可以通过定义触发器、存储过程和视图等对象来实现用户自定义完整性。
触发器可以在数据插入、更新或删除时触发一系列操作,从而对数据进行特定的验证和处理。
Mysql的完整性约束

Mysql的完整性约束Mysql的完整性约束概念 为了防⽌不符合规范的数据进⼊数据库,在⽤户对数据进⾏插⼊、修改、删除等操作时,DBMS⾃动按照⼀定的约束条件对数据进⾏监测,使不符合规范的数据不能进⼊数据库,以确保数据库中存储的数据正确、有效、相容。
约束条件与数据类型的宽度⼀样,都是可选参数,主要分为以下⼏种:# NOT NULL:⾮空约束,指定某列不能为空;# UNIQUE : 唯⼀约束,指定某列或者⼏列组合不能重复# PRIMARY KEY:主键,指定该列的值可以唯⼀地标识该列记录# FOREIGN KEY:外键,指定该⾏记录从属于主表中的⼀条记录,主要⽤于参照完整性NOT NULL是否可空,null表⽰空,⾮字符串not null - 不可空null - 可空mysql>create table t12 (id int not null);Query OK, 0 rows affected (0.02 sec)mysql>select*from t12;Empty set (0.00 sec)mysql>desc t12;+-------+---------+------+-----+---------+-------+| Field | Type |Null|Key|Default| Extra |+-------+---------+------+-----+---------+-------+| id |int(11) | NO ||NULL||+-------+---------+------+-----+---------+-------+1 row in set (0.00 sec)#不能向id列插⼊空元素。
mysql>insert into t12 values (null);ERROR 1048 (23000): Column'id' cannot be nullmysql>insert into t12 values (1);Query OK, 1 row affected (0.01 sec)⽰例DEFAULT我们约束某⼀列不为空,如果这⼀列中经常有重复的内容,就需要我们频繁的插⼊,这样会给我们的操作带来新的负担,于是就出现了默认值的概念。
MySQL中的完整性约束与数据校验

MySQL中的完整性约束与数据校验MySQL是一种开源的关系型数据库管理系统,被广泛应用于互联网和企业级应用中。
在数据库设计和数据操作过程中,确保数据的完整性和准确性非常重要。
为了实现这一目标,MySQL提供了多种完整性约束和数据校验机制。
本文将详细介绍MySQL中的完整性约束和数据校验。
一、什么是完整性约束完整性约束是指在数据库中对数据进行约束性限制的规则,以保证数据的一致性、正确性和有效性。
它是数据库设计中必不可少的一部分,可以帮助开发人员定义合适的数据模型,并确保数据库中的数据满足预期的要求。
在MySQL中,有多种完整性约束可以使用,包括主键约束、唯一约束、外键约束和检查约束等。
1. 主键约束主键约束是最常见和重要的完整性约束之一。
它用于标识关系表中的记录,保证每个记录的唯一性。
主键可以由一个或多个字段组成,并且该字段的值不能为空。
在MySQL中,常用的主键约束是通过在字段定义时添加PRIMARY KEY关键字来实现的。
主键约束的存在可以提高查询性能,因为数据库系统会自动为主键字段创建索引。
2. 唯一约束唯一约束是用于确保字段或字段组合的值在表中的唯一性。
与主键约束不同,唯一约束不要求字段的值不能为空。
唯一约束可以由一个或多个字段组成。
在MySQL中,可以通过在字段定义时添加UNIQUE关键字来实现唯一约束。
唯一约束能够有效地防止数据冗余和重复。
3. 外键约束外键约束用于建立关系表之间的联系。
在关系数据库中,表与表之间的关系可以通过主键和外键进行建立。
外键约束保证了表之间的数据完整性和一致性。
在MySQL中,可以通过在字段定义时添加FOREIGN KEY关键字来实现外键约束。
外键约束可以定义联级操作,包括级联更新和级联删除,以维护相关表之间的数据关系。
4. 检查约束检查约束用于限制字段的取值范围。
通过在字段定义时使用CHECK关键字,可以为字段添加检查约束。
检查约束可以指定一个条件表达式,数据库系统会在插入或更新数据时自动进行验证。
mysql数据库约束(constraint)-初学教程

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字段不能空也不能重复。
MySQL中唯一性约束下能否有空值,空字符串

MySQL中唯⼀性约束下能否有空值,空字符串*问题 1*⾸先,需要搞清楚 “空字符串” 和”NULL”的概念:1:空字符串(”)是不占⽤空间的2: MySQL中的NULL其实是占⽤空间的。
官⽅⽂档说明:NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.长度验证:注意空值的”之间是没有空格的。
select length(''),length(null),length(' ');+------------+--------------+-------------+| length('') | length(null) | length(' ') |+------------+--------------+-------------+| 0 | NULL | 1 |+------------+--------------+-------------+准备数据:create table abc(-> id int(10) primary key,-> c varchar(10) unique default ''); # 主要是为了测试唯⼀性约束下是否能存在重复的 Null,还有空字符串 insert into abc value(1,Null);insert into abc value(2,''); insert into abc value(3,'Null');问题2:查询⾮空字段的两种⽅法的区别:1、select * from tablename where columnname <> ‘’select * from abc where c <> ''; # 确实存在的字符串或者数据+----+------+| id | c |+----+------+| 3 | Null |+----+------+2、select * from tablename where column is not nullselect * from abc where c is not null;+----+------+| id | c |+----+------+| 2 | || 3 | Null |+----+------+插⼊⼆次数据mysql> insert into abc value(4,'');ERROR 1062 (23000): Duplicate entry '' for key 'c'# 说明有唯⼀性约束的情况下不能有重复的空字符串 mysql> insert into abc value(5,Null); Query OK, 1 row affected (0.05 sec) # 可以有重复的空值Null**主键和唯⼀键约束是通过参考索引实施的,如果插⼊的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插⼊全NULL值时,可以有重复的,⽽其他的则不能插⼊重复值## ⼩结:1、NULL其实并不是空值,⽽是要占⽤空间,所以MySQL在进⾏⽐较的时候,NULL会参与字段⽐较,所以对效率有⼀部分影响。
mysql_完整性约束条件

静态列级约束:是对一个列的取值的说明对数据类型的约束:数据的类型、长度、单位、精度等;Mysql支持数据类型的名称后面指定该类型的显示宽度;虽设置显示宽度,但仍然可以插入大于显示宽度的值。
varchar() 存储一个字符,使用2字节表示实际数据长度,一共需要3bytes物理存储空间。
VARCHAR(N)中,N指的是字符的长度对数据格式的约束:YYYY-MM-DD对于日期格式可以以字符串直接insert .字段约束:1、NULL和NOT NULL修饰符;mysql默认情况下指定字段为NULL修饰符。
2、default修饰符可以使用DEFAULT修饰符为字段设定一个默认值。
当插入记录时,忘记传该字段的值,MySQL会自动为您设置上该字段的默认值。
虽能创建成,但有警告。
如果指定字段可以为NULL,则mysql为其设置默认值NULL。
如果NOT NULL,则,MySQL对于数值类型插入0。
3、auto_increment修饰符(只适用于int字段,表明自动为该字段生成一个数(每次在上一次生成的数值上加1))在插入记录时,默认情况第一条记录的值从1开始自增。
因此,该字段不可能出现相同的值。
注意:通常情况下,auto_increment 作为id字段的约束条件,并将id 字段作为表的主键不加primary key ,则创建不成功从主键(primary key )、外键(foreign key)、唯一性约束(unique):1、设置段主键作用1、唯一标识一行;2、作为一个可以被外键所有效引用的对象(非空);3、保证数据的完整性;创建表的时候加上primary key1、2、但如果建立表后已经输入记录,表中的记录要设为主键的字段出现相同的,则此时不能设置主键成功。
2、设置多个字段的主键;1、创建表的时候设置此时的主键是由多个属性组合而成,设置时应该统一设置。
下面不能成功创建主键:(这样就与主键的唯一性相矛盾)2、表已经创建好A在创建好的表中已有一个主键,此时再创建主键(主键的唯一性)则不会成功。
MySql外键约束之CASCADE、SETNULL、RESTRICT、NOACTION分析和作用

MySql外键约束之CASCADE、SETNULL、RESTRICT、NOACTION分析和作⽤MySQL有两种常⽤的引擎类型:MyISAM和InnoDB。
⽬前只有InnoDB引擎类型⽀持外键约束。
InnoDB中外键约束定义的语法如下:ALTER TABLE tbl_nameADD [CONSTRAINT [symbol]] FOREIGN KEY[index_name] (index_col_name, ...)REFERENCES tbl_name (index_col_name,...)[ON DELETE reference_option][ON UPDATE reference_option]例如:ALTER TABLE `user_resource` CONSTRAINT `FKEEAF1E02D82D57F9` FOREIGN KEY (`user_Id`) REFERENCES `sys_user` (`Id`)InnoDB也⽀持使⽤ALTER TABLE来删除外键:ALTER TABLE `user_resource` DROP FOREIGN KEY `FKEEAF1E02D82D57F9`;CASCADE在⽗表上update/delete记录时,同步update/delete掉⼦表的匹配记录SET NULL在⽗表上update/delete记录时,将⼦表上匹配记录的列设为null (要注意⼦表的外键列不能为not null)NO ACTION如果⼦表中有匹配的记录,则不允许对⽗表对应候选键进⾏update/delete操作RESTRICT同no action, 都是⽴即检查外键约束SET NULL⽗表有变更时,⼦表将外键列设置成⼀个默认的值但Innodb不能识别NULL、RESTRICT、NO ACTION删除:从表记录不存在时,主表才可以删除。
删除从表,主表不变更新:从表记录不存在时,主表才可以更新。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、 not null 约束 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。 Null 类型特征: 所有的类型的值都可以是 null,包括 int、float 等数据类型 空字符串””是不等于 null,0 也不等于 null create table temp(
id int auto_increment primary key, name varchar(20) ); 从表 create table student( id int auto_increment, name varchar(22), constraint pk_id primary key(id), classes_id int references classes(id) );
4、 foreign key 约束 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的 两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依 赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不 是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。 创建外键约束: 主表 create table classes(
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束 名称,就默认和列名相同。 MySQL 会给唯一约束的列上默认创建一个唯一索引; create table temp (
id int not null, name varchar(25), password varchar(16), --使用表级约束语法, constraint uk_name_pwd unique(name, password) ); 表示用户名和密码组合不能重复 添加唯一约束 alter table temp add unique(name, password); alter table temp modify name varchar(25) unique; 删除约束 alter table temp drop index name;
自引用、自关联(递归表、树状表) create table tree(
id int auto_increment primary key, name varchar(50), parent_id int, foreign key(parent_id) references tree(id) );
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加 on delete cascade 或 on delete set null,前者是级联删除,后者是将从表的关联列的值设置为 null。 create table student(
alter 添加主键 alter table temp add primary key(name, pwd);
alter 修改列为主键 alter table temp modify id int primary key;
设置主键自增 create table temp(
id int auto_increment primary key, name varchar(20), pwd varchar(16) ); auto_increment 自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。
5、 check 约束 MySQL 可以使用 check 约束,但 check 约束对数据验证没有任何作用。 create table temp(
id int auto_increment, name varchar(20), age int, primary key(id), /*check 约束*/ check(age > 20) ); 上面 check 约束要求 age 必须大于 20,但没有任何作用。但是创建 table 的时候没有任何错 误或警告。
多列外键组合,必须用表级别约束语法: create table classes(
id int, name varchar(20), number int, primary key(name, number) ); create table student( id int auto_increment primary key, name varchar(20), classes_name varchar(20), classes_number int, /*表级别联合外键*/ foreign key(classes_name, classes_number) references classes(name, number) );
);
组合模式: create table temp2(
id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key(name, pwd)
);
alter 删除主键约束 alter table temp drop primary key;
删除外键约束: alter table student drop foreign key student_ibfk_1; alter table student drop foreign key fk_student_id;
增加外键约束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);
id int auto_increment primary key, name varchar(20), classes_name varchar(20), classes_number int, /*表级别联合外键*/ foreign key(classes_name, classes_number) references classes(name, number) on delete cascade );
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束: create table student(
id int auto_increment primary key, name varchar(25),
classes_id int, foreign key(classes_id) references classes(id) ); 上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为 student_ibfk_n, 其中 student 是表名,n 是当前约束从 1 开始的整数。
3、 primary key 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果 的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。MySQL 的主键名总是 PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。 列模式: create table temp(
取消非空约束 alter table temp modify sex varchar(2) null;
取消非空约束,增加默认值 alter table temp modify sex varchar(2) default ‘abc’ null;
2、 unique Байду номын сангаас一约束是指定 table 的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现 重复的值,但是可以为多个 null
/*主键约束*/ id int primary key, name varchar(25) );
create table temp2( id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key(id)
MySQL 中约束保存在 information_schema 数据库的 table_constraints 中,可 以通过该表查询约束信息;
约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被 删除。
常用五类约束:’’ not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复、唯一 foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:检查,指定一个表达式,用于检验指定数据 注意: MySQL 不支持 check 约束,但可以使用 check 约束,而没有任何效果;
id int not null, name varchar(255) not null default ‘abc’, sex char null ) 上面的 table 加上了非空约束,也可以用 alter 来修改或增加非空约束 增加非空约束 alter table temp modify sex varchar(2) not null;
指定约束名称: create table student(
id int auto_increment primary key, name varchar(25), classes_id int, /*指定约束名称*/ constraint fk_classes_id foreign key(classes_id) references classes(id) );