zoukankan      html  css  js  c++  java
  • 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);

     

     

  • 相关阅读:
    css3 box-shadow
    JS的Document属性和方法
    简单配色方案web
    ps中参考线的使用技巧
    min-width() ie6
    js 模拟右键菜单
    display:table-cell
    js opener 的使用
    js的 new image()
    CSS 中文字体 Unicode 编码方案
  • 原文地址:https://www.cnblogs.com/augustyang/p/11079165.html
Copyright © 2011-2022 走看看