mysql建表约束.sql

一、主键约束/自增约束
    1、主键约束:
        它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得改字段不重复且不为空。
        
        列如:
            创建表约束:
                mysql> create table user1(
                    -> id int,
                    -> name varchar(20),
                    -> password varchar(20),
                    -> primary key(id)
                    
            插入数据:
                mysql> insert into user values(1,'zhangsan');
                    Query OK, 1 row affected (0.07 sec)
                
            如果再插入序号为1的张三,就会报错。
            
            查询表属性:
                mysql> desc user;
                    +-------+-------------+------+-----+---------+-------+
                    | Field | Type        | Null | Key | Default | Extra |
                    +-------+-------------+------+-----+---------+-------+
                    | id    | int(11)     | NO   | PRI | NULL    |       |
                    | name  | varchar(20) | YES  |     | NULL    |       |
                    +-------+-------------+------+-----+---------+-------+
            
    2、联合主键:
        只要联合的主键值加起来不重复就可以了
            例子:
                创建联合主键表:
                    mysql> create table user2(
                        -> id int,
                        -> name varchar(20),
                        -> password varchar(20),
                        -> primary key(id,name)
                        -> );
                    Query OK, 0 rows affected (0.06 sec)
                
                查看表属性:
                    mysql> desc user2;
                        +----------+-------------+------+-----+---------+-------+
                        | Field    | Type        | Null | Key | Default | Extra |
                        +----------+-------------+------+-----+---------+-------+
                        | id       | int(11)     | NO   | PRI | 0       |       |
                        | name     | varchar(20) | NO   | PRI |         |       |
                        | password | varchar(20) | YES  |     | NULL    |       |
                        +----------+-------------+------+-----+---------+-------+
                        3 rows in set (0.00 sec)
                        
                插入数据:
                
                    insert into user2 values(1,'张三','123') ----可插入
                    insert into user2 values(1,'张三','123') ----不可插入
                    insert into user2 values(2,'张三','123') ----可插入
                    insert into user2 values(1,'aaa','123') ----可插入
                    insert into user2 values(1NULL,'张三','123') ----不可插入
        
        主键不能为空!!!无论是主键还是联合主键。
    
    
    3、自增约束
        使主键自动增长,可以不用输入主键也可以
        
        例子:
            创建自增约束表:
                mysql> create table user3(
                        -> id int primary key auto_increment,
                        -> name varchar(20)
                        -> );
                    Query OK, 0 rows affected (0.10 sec)
                
                mysql> insert into user3 (name) values('zhangsan');
                    Query OK, 1 row affected (0.04 sec)
                    
            查看表属性:    
                mysql> desc user3;
                    +-------+-------------+------+-----+---------+----------------+
                    | Field | Type        | Null | Key | Default | Extra          |
                    +-------+-------------+------+-----+---------+----------------+
                    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
                    | name  | varchar(20) | YES  |     | NULL    |                |
                    +-------+-------------+------+-----+---------+----------------+
                    2 rows in set (0.01 sec)
                    
            只填入了name值:
                mysql> select * from user3;
                    +----+----------+
                    | id | name     |
                    +----+----------+
                    |  1 | zhangsan |
                    +----+----------+
                    1 row in set (0.00 sec)
            
            id按顺序生成
        
    4、如果说我们创建表的时候,忘记创建主键约束了?该怎么办?
        例子:
            创建没有约束的表:
                create table user4(
                    id int,
                    name varchar(20)
                    );
        
            创建表后,再添加主键
        
                mysql> alter table user4 add primary key(id);        #把id设置为主键
                Query OK, 0 rows affected (0.11 sec)
                Records: 0  Duplicates: 0  Warnings: 0
                   
           
    5、如何删除表里的主键?
        mysql> alter table user4 drop primary key;
            Query OK, 0 rows affected (0.40 sec)
            Records: 0  Duplicates: 0  Warnings: 0
            
    6、修改主键
        mysql> alter table user4 modify id int primary key;
            Query OK, 0 rows affected (0.13 sec)
            Records: 0  Duplicates: 0  Warnings: 0

二、外键约束

    涉及到两个表:父表,子表或者主表,副表
    
    例如:
        创建两个表,一个班级表,一个学生表
            
            mysql> create table classes(            #班级表
                -> id int primary key,
                -> name varchar(20)
                -> );
            Query OK, 0 rows affected (0.07 sec)

            mysql> create table students(            #学生表
                -> id int primary key,
                -> name varchar(20),
                -> class_id int                        #class_id为班级表的id,但还没有进行绑定
                -> foreign key(class_id) references classes(id)            #进行绑定
                -> );
            uery OK, 0 rows affected (0.11 sec)
            
        插入数据:
            插入班级数据:
            insert into classes values(1,'yiban');
            insert into classes values(2,'erban');
            insert into classes values(3,'sanban');
            insert into classes values(4,'siban');
            
            插入学生数据:
            insert into students values(1001,'zhangsan',1);
            insert into students values(1002,'zhangsan',2);
            insert into students values(1003,'zhangsan',3);
            insert into students values(1004,'zhangsan',4);
            insert into students values(1005,'zhangsan',5);-----因为班级id没有5,所有此条插入不成功
            
    总结:
        1、主表classes中没有的数据值,在副表中,是不可以使用的
        2、主表中的记录被副表引用,是不可以被删除的;
            mysql> delete from classes where id=4;             #id为4已结被调用了,无法被删除
                ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db_mo`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
                
三、唯一约束
    约束修饰的字段的值不可以重复
    
    总结:
        1、建表的时候就添加约束
        2、可以使用alter。。。add。。。(建表后再添加)
        3、alter。。。modif。。。
        4、删除alter 。。。drop。。。
    
    1、设置唯一约束:
        例如1:
            创建表:
                create table user5(
                    id int,
                    name varchar(20)
                    );
                
            添加唯一约束:
                mysql> alter table user5 add unique(name);
                    Query OK, 0 rows affected (0.03 sec)
                    Records: 0  Duplicates: 0  Warnings: 0

            查看user5表属性,发现key为UNI
                mysql> desc user5;
                    +-------+-------------+------+-----+---------+-------+
                    | Field | Type        | Null | Key | Default | Extra |
                    +-------+-------------+------+-----+---------+-------+
                    | id    | int(11)     | YES  |     | NULL    |       |
                    | name  | varchar(20) | YES  | UNI | NULL    |       |
                    +-------+-------------+------+-----+---------+-------+
                    2 rows in set (0.00 sec)
            
            插入数据:
                mysql> insert into user5 values(1,'mokaijian');
                    Query OK, 1 row affected (0.04 sec)
                    
            插入相同数据-----报错:
                mysql> insert into user5 values(1,'mokaijian');
                    ERROR 1062 (23000): Duplicate entry 'mokaijian' for key 'name'
                    
            插入不同名字的数据,但是id相同-----ok:
                mysql> insert into user5 values(1,'mokaijia');
                    Query OK, 1 row affected (0.13 sec)
                    
        例如2:----------联合添加唯一主键
        
            创建user6:
                create table user6(
                    id int,
                    name varchar(20),
                    unique(id,name)
                    );
                    
            查询user6属性:
                mysql> desc user6;
                    +-------+-------------+------+-----+---------+-------+
                    | Field | Type        | Null | Key | Default | Extra |
                    +-------+-------------+------+-----+---------+-------+
                    | id    | int(11)     | YES  | MUL | NULL    |       |
                    | name  | varchar(20) | YES  |     | NULL    |       |
                    +-------+-------------+------+-----+---------+-------+
                    2 rows in set (0.04 sec)
                    
                发现联合使用后,Key不是 UNI ,而是 MUL 。
                
            插入数据:
                insert into user6 values(1,'zhangsan');
                insert into user6 values(2,'zhangsan');
                insert into user6 values(1,'lisi');
                
                以上三种都可以插入
    
    
    2、删除唯一约束
        alter table user5 drop index name;
        
        例子:(已有user5,唯一约束为name)
            删除唯一约束:
                mysql> alter table user5 drop index name; 
                    Query OK, 0 rows affected (0.09 sec)
                    Records: 0  Duplicates: 0  Warnings: 0

            查看表属性:
                mysql> desc user5;
                    +-------+-------------+------+-----+---------+-------+
                    | Field | Type        | Null | Key | Default | Extra |
                    +-------+-------------+------+-----+---------+-------+
                    | id    | int(11)     | YES  |     | NULL    |       |
                    | name  | varchar(20) | YES  |     | NULL    |       |
                    +-------+-------------+------+-----+---------+-------+
                    2 rows in set (0.00 sec)
            
    3、添加----modify
        添加唯一约束:(已有user5,状态为无约束)
            mysql> alter table user5 modify name varchar(20) unique;
                Query OK, 0 rows affected (0.09 sec)
                Records: 0  Duplicates: 0  Warnings: 0
            
        查看表属性:

            mysql> desc user5;
                +-------+-------------+------+-----+---------+-------+
                | Field | Type        | Null | Key | Default | Extra |
                +-------+-------------+------+-----+---------+-------+
                | id    | int(11)     | YES  |     | NULL    |       |
                | name  | varchar(20) | YES  | UNI | NULL    |       |
                +-------+-------------+------+-----+---------+-------+
                2 rows in set (0.00 sec)
            

四、非空约束
    
    修饰的字段不能为空  NULL
    
    例子:
        创建非空约束表:
        mysql> create table user8(
            -> id int,
            -> name varchar(20) not null
            -> );
        Query OK, 0 rows affected (0.11 sec)

        查看表属性,发现Null中name为NO。
        mysql> desc user8;
            +-------+-------------+------+-----+---------+-------+
            | Field | Type        | Null | Key | Default | Extra |
            +-------+-------------+------+-----+---------+-------+
            | id    | int(11)     | YES  |     | NULL    |       |
            | name  | varchar(20) | NO   |     | NULL    |       |
            +-------+-------------+------+-----+---------+-------+
            2 rows in set (0.00 sec)
            
        插入数据:
            mysql> insert into user8 (id) values(1); ----------只插入id,不填写name,无法插入
                ERROR 1364 (HY000): Field 'name' doesn't have a default value
                
            mysql> insert into user8  values(1,'mo');---------同时插入id和name------成功
                Query OK, 1 row affected (0.00 sec)
                
            mysql> insert into user8 (name) values('mo1');---------只插入name,不插入id--------成功
                Query OK, 1 row affected (0.05 sec)

五、默认约束
    
    就是当我们插入字段值的时候,如果没有传值,就会使用默认值
    
    例子:    
        新建默认约束表:
            mysql> create table user9(
                -> id int,
                -> name varchar(20),
                -> age int default 10
                -> );
            Query OK, 0 rows affected (0.01 sec)
            
        查看表属性:(其中,age的default为默认值10)

            mysql> desc user9;
                +-------+-------------+------+-----+---------+-------+
                | Field | Type        | Null | Key | Default | Extra |
                +-------+-------------+------+-----+---------+-------+
                | id    | int(11)     | YES  |     | NULL    |       |
                | name  | varchar(20) | YES  |     | NULL    |       |
                | age   | int(11)     | YES  |     | 10      |       |
                +-------+-------------+------+-----+---------+-------+
                3 rows in set (0.03 sec)
                
                
        插入数据,但没有传入age值:
            mysql> insert into user9 (id,name) values(1,'zhangsan');
                Query OK, 1 row affected (0.01 sec)
        
        查看数据,发现age已经默认为10:
            mysql> select * from user9;
                +------+----------+------+
                | id   | name     | age  |
                +------+----------+------+
                |    1 | zhangsan |   10 |
                +------+----------+------+
                1 row in set (0.00 sec)
                

    
    
        
                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值