约束 级联

约束

  除了数据类型以外额外添加的约束和数据类型一样是可选参数,添加约束是为了保证数据的一致性,完整性,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充

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

UNSIGNED 无符号
ZEROFILL 使用0填充

not null  不可空 不添加约束条件not null 的话字段默认是null,插入数据时如果未设置则自动添加默认值

mysql> create table t(id int);               #字段默认可以插入空
Query OK, 0 rows affected (0.24 sec)

mysql> desc t;    #查看表显示默认为null
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> insert into t values();        #插入一个空的值
Query OK, 1 row affected (0.06 sec)

mysql> select * from t;    #查询到表内有一个 null 的记录
+------+
| id   |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

创建一个t2表设置为不能为空 插入一个空的数据 就会报错

default 默认值约束 可以指定字段的默认值

设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值

   create table user (id ind,name char(10) not null,sex char(1) default "man");

 

unique 唯一性约束 该字段的值不能重复

unique其实是一种索引,索引是一种数据结构,用于提高查询效率

单列唯一约束

  create table t1(id char(10) unique);

多列联合唯一约束

  create table t2(id char(10),number char(12),unique(id,number));

多列情况下 两个都相同的就重复 单个不相同就不会

设置唯一约束 UNIQUE
方法一:
create table department1(
id int,
name varchar(20) unique,
comment varchar(100)
);


方法二:
create table department2(
id int,
name varchar(20),
comment varchar(100),
constraint uk_name unique(name)
);


mysql> insert into department1 values(1,'IT','技术');
Query OK, 1 row affected (0.00 sec)
mysql> insert into department1 values(1,'IT','技术');
ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'

primary key主键约束 标识该字段为该表的主键,可以唯一的标识记录,从约束的角度来看主键约束和非空加唯一约束没有区别

  create table student(id int primary key);

主键也可以多列联合 和上面的unique用法一样

一张表中必须有且只有一个主键。主键的字段名基本上都叫id,主键的类型需要设置成整型,别的也可以但是最好不好设置其他的

单列主键
#方法一:not null+unique
create table department1(
id int not null unique, #主键
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
多列做主键
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);

auto_increment

通常搭配主键字段使用 可以自动为你的数据分配逐渐增加

    create table t9(id int primary key auto_increment,name char(3));

不指定id,则自动增长
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);

也可以指定id
mysql> insert into student values(4,'a','female');

mysql> insert into student values(7,'w','female');

修改自动增长的起始位置  
    alter table t9 auto_increment = 7;
也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外
create table student(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') default 'male'
  )auto_increment=3;

对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长,应该用truncate清空表,
比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它 自动增长 只能用于整型

 foreign key 专门用于为表和表之间建立物理关联

两个表之间的关系有:多对一,多对多,一对一

多对一

create table dept(id int primary key auto_increment,name char(10),manager char(10));

create table emp(id int primary key auto_increment,name char(10),dept_id int,
                           foreign key(dept_id) references dept(id));

多对多 :用户表+用户与主机关系表+主机表
先创建了一个教师表
create table teacher (id int primary key auto_increment,name char(10));
再创建一个学生表
create table student (id int primary key auto_increment,name char(10));
               create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id)
               );
再创建一个存放教师和学生关系的关系表
create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id),
               primary key(t_id,s_id)
               );

添加外键约束时: 被关联的表需要先被创建
         主表应该先插入 从表后插入
                          在删除数据前(主表)前 要保证该从表数据都删除了
                          在更新数据前 要先保证从表没有数据关联到主表

 
级联:

指的是就是同步更新和删除
语法:在创建外键时 在后面添加 on update cascade 同步更新
              on delete cascade 同步删除

实例:
      create table class(id int primary key auto_increment,name char(10));

      create table student(
              id int primary key auto_increment,
              name char(10),
              c_id int,
              foreign key(c_id) references class(id)
              on update cascade
              on delete cascade
              );
原文地址:https://www.cnblogs.com/layerluo/p/9643204.html