精华内容
参与话题
问答
  • MySQL——约束(constraint)详解

    万次阅读 多人点赞 2018-03-22 15:40:04
    约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效 比如name字段中要让其用户名不重复,这就需要添加约束。或者...

    该博客说说关于数据库中一个重要的知识点——约束

    一、什么是约束

    约束英文:constraint

    约束实际上就是表中数据的限制条件


    二、约束作用

    表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效

    • 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的时候需要添加邮箱等

    三、约束种类

    • 非空约束(not null)
    • 唯一性约束(unique)
    • 主键约束(primary key) PK
    • 外键约束(foreign key) FK
    • 检查约束(目前MySQL不支持、Oracle支持)

    下面将逐一介绍以上约束


    四、非空约束

    用not null约束的字段不能为null值,必须给定具体的数据

    创建表,给字段添加非空约束(创建用户表,用户名不能为空)

    	mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null
        -> );
    Query OK, 0 rows affected (0.08 sec)
    

    如果没有插入name字段数据,则会报错

    mysql> insert into t_user (id) values(1);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value
    

    五、唯一性约束

    unique约束的字段,具有唯一性,不可重复,但可以为null

    ###创建表,保证邮箱地址唯一(列级约束)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128) unique
        -> );
    Query OK, 0 rows affected (0.03 sec)
    

    1、表级约束

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
    	-> unique(email)
        -> );
    

    如果插入相同email会报错

    mysql> insert into t_user(id,name,email) values(1,'xlj','932834897@qq.com');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t_user(id,name,email) values(2,'jay','932834897@qq.com');
    ERROR 1062 (23000): Duplicate entry '932834897@qq.com' for key 'email'
    

    2、使用表级约束,给多个字段联合约束

    联合约束,表示两个或以上的字段同时与另一条记录相等,则报错

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
        -> unique(name,email)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    

    插入第一条数据

    mysql> insert into t_user(id,name,email) values(1,'xxx','qq.com');
    Query OK, 1 row affected (0.05 sec)
    

    插入第二条数据如果是与联合字段中的一条相同另一条相同,也是可以的

    mysql> insert into t_user(id,name,email) values(2,'mmm','qq.com');
    Query OK, 1 row affected (0.05 sec)
    

    插入第三条数据,如果与联合字段都相同,则报错

    mysql> insert into t_user(id,name,email) values(3,'mmm','qq.com');
    ERROR 1062 (23000): Duplicate entry 'mmm-qq.com' for key 'name'
    

    3、表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128),
        -> constraint t_user_email_unique unique(email)
        -> );
    Query OK, 0 rows affected (0.06 sec)
    

    constraint是约束关键字,t_user_email_unique自己取的名字

    例:用户名既不能为空,也不能重复

    name varchar(32) not null unique
    

    六、主键约束(primary key)PK

    表设计时一定要有主键

    1、主键涉及术语

    • 主键约束
    • 主键字段
    • 主键值

    2、以上三种术语关系

    表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值

    3、主键约束与“not null unique”区别

    给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和"not null unique"约束相同,但是本质不同。

    主键约束除了可以做到"not null unique"之外,还会默认添加"索引——index"

    4、一张表应该有主键字段,如果没有,表示该表无效

    • 主键值:是当前行数据的唯一标识、是当前行数据的身份证号
    • 即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

    5、按主键约束的字段数量分类

    无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)

    • 单一主键:给一个字段添加主键约束
    • 复合主键:给多个字段联合添加一个主键约束(只能用表级定义)

    单一主键(列级定义)

    mysql> create table t_user(
        -> id int(10) primary key,
        -> name varchar(32)
        -> );
    Query OK, 0 rows affected (0.07 sec)
    

    单一主键(表级定义)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> constraint t_user_id_pk primary key(id)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    

    复合主键(表级定义)

    mysql> create table t_user(
        -> id int(10),
        -> name varchar(32) not null,
        -> email varchar(128) unique,
        -> primary key(id,name)
        -> );
    Query OK, 0 rows affected (0.05 sec)
    

    6、在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)

    mysql> create table t_user(
        -> id int(10) primary key auto_increment,
        -> name varchar(32) not null
        -> );
    Query OK, 0 rows affected (0.03 sec)
    

    插入两行记录,id主键值会自动增加

    mysql> insert into t_user(name) values('jay');
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into t_user(name) values('man');
    Query OK, 1 row affected (0.00 sec)
    
    
    mysql> select * from t_user;
    +----+------+
    | id | name |
    +----+------+
    |  1 | jay  |
    |  2 | man  |
    +----+------+
    2 rows in set (0.00 sec)
    

    七、外键约束(foreign key)FK

    只能是表级定义(如以下例子)

    foreign key(classno) references t_class(cno)
    

    什么是外键

    若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

    A为基本表,B为信息表

    1、外键涉及到的术语

    • 外键约束
    • 外键字段
    • 外键值

    2、外键约束、外键字段、外键值之间的关系

    某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

    3、按外键约束的字段数量分类

    • 单一外键:给一个字段添加外键约束
    • 复合外键:给多个字段联合添加一个外键约束

    4、一张表可以有多个外键字段(与主键不同)

    5、分析场景

    设计数据库表,用来存储学生和班级信息

    两种方案

    方案一:将学生信息和班级信息存储到一张表
    sno     sname      classno      cname
    1       jay			100			浙江省第一中学高三1班
    2		lucy		100			浙江省第一中学高三1班
    3		king		200			浙江省第一中学高三2班
    

    缺点:数据冗余,比如cname字段的数据重复太多

    方案二:将学生信息和班级信息分开两张表存储

    学生表(添加单一外键)

    sno(pk)		sname		classno(fk)
    1			jack		100
    2			lucy		100
    3			king		200
    

    班级表

    cno(pk)		cname
    100			浙江省第一中学高三1班
    200			浙江省第一中学高三2班
    

    结论

    为了保证学生表中的classno字段中的数据必须来自于班级表中的cno字段中的数据,有必要给学生表中的classno字段添加外键约束

    注意点

    • 外键值可以为null
    • 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
    • 有了外键引用之后,表分为父表和子表
      • 班级表:父表
      • 学生表:子表
    • 创建先创建父表
    • 删除先删除子表数据
    • 插入先插入父表数据

    存储学生班级信息

    mysql> drop table if exists t_student;
    mysql> drop table if exists t_class;
    
    mysql> create table t_class(
        -> cno int(10) primary key,
        -> cname varchar(128) not null unique
        -> );
    
    mysql> create table t_student(
        -> sno int(10) primary key auto_increment,
        -> sname varchar(32) not null,
        -> classno int(3),
        -> foreign key(classno) references t_class(cno)
        -> );
    
    mysql> insert into t_class(cno,cname) values(100,'aaaaaaxxxxxx');
    mysql> insert into t_class(cno,cname) values(200,'oooooopppppp');
    mysql> insert into t_student(sname,classno) values('jack',100);
    mysql> insert into t_student(sname,classno) values('lucy',100);
    mysql> insert into t_student(sname,classno) values('king',200);
    

    班级表t_class

    mysql> select * from t_class;
    +-----+--------------+
    | cno | cname        |
    +-----+--------------+
    | 100 | aaaaaaxxxxxx |
    | 200 | oooooopppppp |
    +-----+--------------+
    

    学生表t_student

    mysql> select * from t_student;
    +-----+-------+---------+
    | sno | sname | classno |
    +-----+-------+---------+
    |   1 | jack  |     100 |
    |   2 | lucy  |     100 |
    |   3 | king  |     200 |
    +-----+-------+---------+
    

    上表中找出每个学生的班级名称

    mysql> select s.*,c.* from t_student s join t_class c on s.classno=c.cno;
    +-----+-------+---------+-----+--------------+
    | sno | sname | classno | cno | cname        |
    +-----+-------+---------+-----+--------------+
    |   1 | jack  |     100 | 100 | aaaaaaxxxxxx |
    |   2 | lucy  |     100 | 100 | aaaaaaxxxxxx |
    |   3 | king  |     200 | 200 | oooooopppppp |
    +-----+-------+---------+-----+--------------+
    

    结论

    以上是典型的一对多的设计:在多个地方加外键(子表加外键)

    展开全文
  • Mysql CONSTRAINT 约束

    2018-10-25 23:38:34
    CONSTRAINT 表中数据约束条件 。作用:表中记录的数据完整性和有效性. 约束种类: 1. 非空约束 NOT NULL 2.唯一性约束 UNIQUE 3.主键约束 PRIMARY KEY PK 4.外键约束 FOREIGN KEY FK 5.检查约束MYSQL 暂不...

    CONSTRAINT 表中数据约束条件 。作用:表中记录的数据完整性和有效性.

    约束种类:

    1. 非空约束 NOT NULL

    2.唯一性约束 UNIQUE

    3.主键约束 PRIMARY KEY PK

    4.外键约束 FOREIGN KEY FK

    5.检查约束 (MYSQL 暂不支持 Oracle支持)

    约束详解:

    1. 非空约束 NOT NULL  定义字段的时候 加入了 这个约束 那么必须插入数据 否则 报错

    2.唯一性约束 UNIQUE

     

     

    参考大神博客:https://blog.csdn.net/w_linux/article/details/79655073

    展开全文
  • Mysql 约束(Constraint)

    万次阅读 2013-01-29 12:33:09
    约束Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束...
    约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束(Primary Key
     Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。

    1 主关键字约束
    主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。每个表中只能有一列被指定为主关键字,且IMAGE 和TEXT 类型的列不能被指定为主关键字,也不允许指定主关键字列有NULL 属性。
    定义主关键字约束的语法如下:
    CONSTRAINT constraint_name
    PRIMARY KEY [CLUSTERED | NONCLUSTERED]
    (column_name1[, column_name2,…,column_name16])
    各参数说明如下:


    constraint_name
    指定约束的名称约束的名称。在数据库中应是惟一的。如果不指定,则系统会自动生成一个约束名。 
    CLUSTERED | NONCLUSTERED
    指定索引类别,CLUSTERED 为缺省值。其具体信息请参见下一章。 
    column_name
    指定组成主关键字的列名。主关键字最多由16 个列组成。

    例7-3: 创建一个产品信息表,以产品编号和名称为主关键字
    create table products (
    p_id char(8) not null,
    p_name char(10) not null ,
    price money default 0.01 ,
    quantity smallint null ,
    constraint pk_p_id primary key (p_id, p_name)
    ) on [primary] 

    2 外关键字约束
    外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。
    定义外关键字约束的语法如下:
    CONSTRAINT constraint_name
    FOREIGN KEY (column_name1[, column_name2,…,column_name16])
    REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
    [ ON DELETE { CASCADE | NO ACTION } ]
    [ ON UPDATE { CASCADE | NO ACTION } ] ]
    [ NOT FOR REPLICATION ]
    各参数说明如下: 

    REFERENCES
    指定要建立关联的表的信息。 
    ref_table
    指定要建立关联的表的名称。 
    ref_column
    指定要建立关联的表中的相关列的名称。 
    ON DELETE {CASCADE | NO ACTION}
    指定在删除表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的删除操作回滚。NO ACTION 是缺省值。 
    ON UPDATE {CASCADE | NO ACTION}
    指定在更新表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在更新父表数据行时会将子表中对应的数据行更新;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的更新操作回滚。NO ACTION 是缺省值。 
    NOT FOR REPLICATION
    指定列的外关键字约束在把从其它表中复制的数据插入到表中时不发生作用。
    例7-4:创建一个订货表,与前面创建的产品表相关联
    create table   orders(
    order_id char(8),
    p_id char(8),
    p_name char(10) ,
    constraint pk_order_id primary key (order_id) ,
    foreign key(p_id, p_name) references products(p_id, p_name)
    ) on [primary]
    注意:临时表不能指定外关键字约束。 
    惟一性约束
    惟一性约束指定一个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。惟一性约束指定的列可以有NULL 属性。由于主关键字值是具有惟一性的,因此主关键字列不能再设定惟一性约束。惟一性约束最多由16 个列组成。
    定义惟一性约束的语法如下:
    CONSTRAINT constraint_name
    UNIQUE [CLUSTERED | NONCLUSTERED]
    (column_name1[, column_name2,…,column_name16])

    例7-5:定义一个员工信息表,其中员工的身份证号具有惟一性。
    create table employees (
    emp_id char(8),
    emp_name char(10) ,
    emp_cardid char(18),
    constraint pk_emp_id primary key (emp_id),
    constraint uk_emp_cardid unique (emp_cardid)
    ) on [primary]

    7.2.4 检查约束
    检查约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。可以对每个列设置符合检查。
    定义检查约束的语法如下:
    CONSTRAINT constraint_name
    CHECK [NOT FOR REPLICATION]
    (logical_expression)
    各参数说明如下:
    NOT FOR REPLICATION
    指定检查约束在把从其它表中复制的数据插入到表中时不发生作用。
    logical_expression
    指定逻辑条件表达式返回值为TRUE 或FALSE。
    例7-6: 创建一个订货表其中定货量必须不小于10。
    create table   orders(
    order_id char(8),
    p_id char(8),
    p_name char(10) ,
    quantity smallint,
    constraint pk_order_id primary key (order_id),
    constraint chk_quantity check (quantity>=10) ,
    ) on [primary]
    注意:对计算列不能作除检查约束外的任何约束。

    7.2.5 缺省约束
    缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值。SQL Server 推荐使用缺省约束,而不使用定义缺省值的方式来指定列的缺省值。有关绑定缺省约束的方法请参见“数据完整性”章节。
    定义缺省约束的语法如下:
    CONSTRAINT constraint_name
    DEFAULT constant_expression [FOR column_name]
    例7-7:
    constraint de_order_quantity default 100 for   order_quantity
    注意:不能在创建表时定义缺省约束,只能向已经创建好的表中添加缺省约束。


    7.2.6 列约束和表约束
    对于数据库来说,约束又分为列约束(Column Constraint)和表约束(Table Constraint)。
    列约束作为列定义的一部分只作用于此列本身。表约束作为表定义的一部分,可以作用于
    多个列。
    下面举例说明列约束与表约束的区别。
    例7-8:
    create table products (
    p_id char(8) ,
    p_name char(10) ,
    price money default 0.01 ,
    quantity smallint check (quantity>=10) , /* 列约束 */
    constraint pk_p_id primary key (p_id, p_name) /* 表约束 */
    展开全文
  • MySQL约束Constraint

    2020-08-20 21:28:18
    约束 1.自动增长约束 (auto_increment) 自动增长约束,都是加在主键上,一般也就是id上,在创建表的时候,直接写在需要自动增长的字段的数据类型后面。 insert into添加数据的方式 1. 指定字段名称,字段名称中...

    约束

    1.自动增长约束
    (auto_increment)

    自动增长约束,都是加在主键上,一般也就是id上,在创建表的时候,直接写在需要自动增长的字段的数据类型后面。

    insert into添加数据的方式
    1.
    在这里插入图片描述
    指定字段名称,字段名称中不要包含自动增长列,自动增长列会自动生成增加。
    2.
    在这里插入图片描述
    不指定每个字段的名称,那么需要在自动增长的列上的值,设定一个null,也可为此设置序号。

    如果手动添加后会在最大id的基础上继续增加
    在这里插入图片描述
    delete from 表名,只是删除表数据,没有更改表中的计数器,如果再次增加记录,会在之前最大id的基础上自增
    在这里插入图片描述
    如果想要这个表结构,并不想要里面的内容可以使用 :truncate 表名
    在这里插入图片描述

    2.非空约束
    (not null)
    添加方式:
    1、创建表的时候,在需要添加非空约束的字段后面,加上not null
    2、在创建表之后,修改表结构,modify
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    1、添加一条记录时,如果没有指定非空字段的值,默认设定为空串或者0
    2、如果强制设定有非空约束的字段的值为null,则会报错
    (打开的端口不一样,使用的效果也可能会有不同,可以看到在MySQL窗口执行错误,在SQLyog里则可以执行,执行后的结果在MySQL窗口可以查到)

    3.唯一性约束
    一、含义:
    有了唯一性约束的字段,不能有重复的值
    二、和主键的关系:
    1、主键默认就包含了唯一性约束
    2、主键还包含了非空约束
    3、一张表只能有一个主键,但是可以有很多字段都设定非空的约束,或者是唯一性约束

    三、添加唯一性约束的方式: Unique
    1、创建表的时候,在某个字段后面,直接写上唯一性的关键字Unique
    2、在创建表的最后,在约束的区域,加上约束的声明
    Constraint 约束名称 unique(非空的字段名称)
    3、创建表之后,通过alter方式修改表的约束
    I、add constraint
    II、modify 字段名
    在这里插入图片描述
    A.插入一条记录,只指定产品数量,其他的不指定
    在这里插入图片描述
    pid有自动增长是1,产品名称非空所以空串,价格默认为10



    第二次添加失败,违反了pname的唯一性约束,不能两个产品的名称都为空串
    在这里插入图片描述
    B.第二种添加唯一性约束的方式,可以针对两个字段加唯一性约束,表示两个字段加起来不能重复

    在这里插入图片描述

    由下可以得出结论只要两个字段不同时重复,就可以使数据插入。
    在这里插入图片描述
    C.第三种添加唯一性约束的方式,创建表之后,进行添加,可以使用两种方式添加
    在这里插入图片描述
    第一种修改表结构,可以针对多个字段联合添加唯一性约束
    在这里插入图片描述
    第二种修改表结构,只能给一个字段添加唯一性约束
    在这里插入图片描述


    由下可以得出看出,第一条数据插入成功,第二条数据pname重复,第三条pid重复,第四条都不重复,插入成功。由此可得出结论所有数据都不同时方可数据插入成功。
    在这里插入图片描述

    展开全文
  • 【转】Mysql 约束(Constraint)

    千次阅读 2017-04-01 11:10:05
    约束Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束...
  • 约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册...
  • 建立外键SQL语法 ALTER TABLE ... ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTR...
  • Mysql Constraint Check Workarounds MYSQL约束的处理http://forums.mysql.com/read.php?136,152474,240479#msg-240479As the MySQL Reference Manual says: "The CHECK clause is parsed but ignored by all ...
  • MySQL语言之约束(constraint)

    千次阅读 2018-09-09 11:08:27
    约束CONSTRAINT:  对插入表中字段的数据起到一定的条件限制。 约束分五种:  主键约束:PRIMARY KEY  要求作为主键的字段非空且唯一。 主键约束 1、创建表t_01 字段tid INT 设置为主键约束,tname varchat(20...
  • 约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效性 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的...
  • 约束英文:constraint 约束实际上就是表中数据的限制条件 二、约束作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效 比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的时候...
  • MySQL中的约束,添加约束,删除约束,以及其他的一些修饰: 一.NOT NULL(非空约束) 添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) NOT NULL); 2)通过ALTER 语句 ALTER TABLE t_...
  • ENUM约束 --使用ENUM来限制用户输入 CREATE TABLE Student ( StudentID INT AUTO_INCREMENT PRIMARY KEY, ClassID INT, StudentName VARCHAR(200), Sex ENUM('Male','Female') ...
  • MySQL 约束

    千次阅读 2020-07-03 18:11:38
    花了半天时间整理的 MySQL 约束笔记,建议收藏

空空如也

1 2 3 4 5 ... 20
收藏数 33,965
精华内容 13,586
关键字:

constraint