python 学习_第四模块 mysql 完整性约束

python 学习_第四模块  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填充

 

 二  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);

 

 

猜你喜欢

转载自www.cnblogs.com/augustyang/p/11079165.html