7-[表操作]--完整性约束

1、介绍

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

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

PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)    标识该字段为该表的外键
NOT NULL    标识该字段不能为空
UNIQUE KEY (UK)    标识该字段的值是唯一的
AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT    为该字段设置默认值

UNSIGNED 无符号
ZEROFILL 使用0填充

 

 

 

2、zerofill:使用0填充    UNSIGNED:无符号

 

 

3、not null与default

  

#==================not null====================
mysql> create table t1(id int); #id字段默认可以插入空
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
mysql> insert into t1 values(); #可以插入空


mysql> create table t2(id int not null); #设置字段id不为空
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
mysql> insert into t2 values(); #不能插入空
ERROR 1364 (HY000): Field 'id' doesn't have a default value



#==================default====================
#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
mysql> create table t3(id int default 1);
mysql> alter table t3 modify id int not null default 1;

 

 

==================综合练习====================
mysql> create table student(
    -> name varchar(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'
    -> );
mysql> desc student;
+-------+------------------------------------+------+-----+------------+-------+
| Field | Type                               | Null | Key | Default    | Extra |
+-------+------------------------------------+------+-----+------------+-------+
| name  | varchar(20)                        | NO   |     | NULL       |       |
| age   | int(3) unsigned                    | NO   |     | 18         |       |
| sex   | enum('male','female')              | YES  |     | male       |       |
| hobby | set('play','study','read','music') | YES  |     | play,music |       |
+-------+------------------------------------+------+-----+------------+-------+
mysql> insert into student(name) values('egon');
mysql> select * from student;
+------+-----+------+------------+
| name | age | sex  | hobby      |
+------+-----+------+------------+
| egon |  18 | male | play,music |
+------+-----+------+------------+

验证
验证

 

 

 

4、 unique 唯一

   (1)单列唯一

设置唯一约束 UNIQUE===============
#方法一:
    create table department(
    id int ,
    name char(10) unique
);
desc department;


insert into department values
(1,'IT'),
(2,'IT');


# 方法2:
create table department2(
    id int,
    name char(10),
    unique(id),
    unique(name)
);

desc department2;

insert into department2 values
(1,'IT'),
(2,'sale');

 

 

 

 

 

  (2)联合唯一

# 联合唯一
create table services(
    id int,
    ip char(15),
    port int,
    unique(id),
    unique(ip,port)
);

desc services;

insert into services values
(1,'192.168.0.1',80),
(2,'192.168.0.2',80),
(3,'192.168.0.2',82);

select * from services;

insert into services values(5,'192.168.0.1','80');

 

 

5、 primary key

约束:not null unqiue
存储引擎(innodb):对于innodb存储引擎来说,一张表必须有一个主键

 

  (1)单列主键

单列做主键===============
#方法一:not null+unique
create table department1(
id int not null unique, #主键(只是约束条件形式的),primary key必须满足两个条件
name varchar(20) not null unique,
comment varchar(100)
);

#方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(20),
comment varchar(100)
);

#方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
constraint pk_name primary key(id); #创建主键并为其命名pk_name

 

 

 

 

   (2)复合主键

create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)       #复合主键
);    

 

 

 

 

 

6、 auto_increment:自动增长,被key约束

  (1)自动增长

#不指定id,则自动增长

 

 

#也可以指定id

 

#对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长

  

  (2) 清空表:delete 、truncate

 

# 应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它

delete from t20;
delete from t20 where id = 3;
insert into t20(name) values
('xxx');

truncate t20; #应该用它来清空表

 

 

   

 

  (3)步长与偏移量

    show variables like 'auto_inc%';

    #步长:
    auto_increment_increment默认为1
    #起始偏移量
    auto_increment_offset默认1

  

 

    #设置步长
    set session auto_increment_increment=5;  # 基于会话级别
    set global auto_increment_increment=5;   # 修改全局级别的步长(所有会话都生效)
    

 

 

 

    #设置起始偏移量
    set global auto_increment_offset=3;
    强调:起始偏移量<=步长
    mysql> show variables like 'auto_incre%'; #需要退出重新登录

 

 

# 验证    
      create table t21(
        id int primary key auto_increment,
        name char(16)
    );
    
    insert into t21(name) values
    ('egon'),
    ('alex'),
    ('wxx'),
    ('yxx');
        

 

 

 

 

2

 

3

 

 

4

 

 

5

 

6

 

 

7:


 

posted @ 2018-05-11 15:48  venicid  阅读(271)  评论(0编辑  收藏  举报