返回顶部

mysql 完整性约束

mysql  完整性约束

 

not null与default

unique

primary key

auto_increment

foreign key

 

一 介绍

 

约束条件与数据类型的宽度一样,都是可选参数

作用:用于保证数据的完整性和一致性
主要分为:

primary key         -- 标识该字段为该表的主键, 可以唯一的标识记录
foreign key            -- 标识该字段为该表的外键
not null            -- 标识该字段不能为空
unique key             -- 标识该字段的值是唯一的
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 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

 

二 not null 与default

 

create table tb11(
id int not null default 2, 
num int  not null 
);

 

 

mysql> desc tb11;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | 2       |       |
| num   | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

 

 

mysql> insert into tb11(num) values(21);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tb11;
+----+-----+
| id | num |
+----+-----+
|  2 |  21 |
+----+-----+

 

 

 

mysql> create table student(
    -> name char(20) not null,
    -> age int(3) unsigned not null default 18,
    -> sex enum('male','female') default 'male',
    -> hobby set('play','study','read','music') default 'play,music'
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into student(name) values('egon');
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+------+-----+------+------------+
| name | age | sex  | hobby      |
+------+-----+------+------------+
| egon |  18 | male | play,music |
+------+-----+------+------------+
1 row in set (0.00 sec)

 

 

 三 unique

 

1.设置唯一约束 UNIQUE

 

-- 方法一
create table tt1(
id int,
name char(20) unique,
comment char(20)
);

-- 方法二
create table tt2(
id int,
name char(20),
comment char(20),
unique(name)
);

 

 

 

 

 

create table tt11(
id int not null unique);

等于

create table tt12( 
id int primary key );

 

 

2. 设置联合唯一

 

mysql> create table  service(
    -> id int primary key auto_increment,
    -> name  char(20),
    -> host varchar(15) not null,
    -> port int not null,
    -> unique(host,port)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into  service values
    -> (1,'nginx','192.168.2.1',80),
    -> (2,'haproxy','192.168.2.2',80),
    -> (3,'mysql','192.168.2.3',3306)
    -> ;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into  service(name,host,port) values('nginx','192.168.2.1',80);
ERROR 1062 (23000): Duplicate entry '192.168.2.1-80' for key 'host'

 

 

 

 

四 primary key 

 

primary key 字段的值不为空且唯一

 

一个表中可以
单列做主键
多列做主键(复合主键)

 

但一个表内只能有一个主键primary key

 

1.单列做主键

--  方法一  not null+unique
create table ta1(
id int not null unique,
name varchar(20),
comment varchar(100)
);

--  方法二  primary key
create table ta2(
id int primary key ,
name varchar(20),
comment varchar(100)
);

-- 方法三 在所有字段后单独定义primary key

create table ta3(
id int ,
name varchar(20),
comment varchar(100),
primary key(id)
);

 

 

2  多列做主键 

 

 

create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);

 

 

 

五 auto_increment

 

约束字段为自动增长, 被约束的字段必须同时被key约束
1. 不指定id,则自动增长
2. 可以指定id
3. 对于自增字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
4. 使用truncate 清空表 truncate table tb11;

 

create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);

 

 

六 foreign key

 

#1、建立表关系:
    #先建被关联的表,并且保证被关联的字段唯一
    create table dep(
        id int primary key,
        name char(16),
        comment char(50)
    );


    #再建立关联的表
    create table emp(
        id int primary key,
        name char(10),
        sex enum('male','female'),
        dep_id int,
        foreign key(dep_id) references dep(id) 
        on delete cascade 
        on update cascade
    );

#2、插入数据
#先往被关联表插入记录
        insert into dep values
        (1,"IT","技术能力有限部门"),
        (2,"销售","销售能力不足部门"),
        (3,"财务","花钱特别多部门");

#再往关联表插入记录
        insert into emp values
        (1,'egon','male',1);

        insert into emp values
        (2,'alex','male',1),
        (3,'wupeiqi','female',2),
        (4,'yuanhao','male',3),
        (5,'jinximn','male',2);

 

 

 

 

 

posted on 2019-06-24 20:04  augustyang  阅读(234)  评论(0编辑  收藏  举报

导航