zoukankan      html  css  js  c++  java
  • 约束条件

    一、创建表的完整语法
    #语法:
    create table 库名.表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
    );
    约束条件:是在数据类型之外对字段附加的额外的限制

    #注意:
    1、最后一个字段之后不能加逗号
    2. 在同一张表中,字段名是不能相同
    3. 宽度和约束条件可选,字段名和类型是必须的



    二、 not null与default
    not null + default

    create table t1(
    id int primary key auto_increment,
    name varchar(16) not null,
    sex enum('male','female') not null default 'male'
    );



    三、unique key
    unique 限制字段的值唯一

    #单列唯一
    create table t2(x int unique);
    create table t3(
    x int,
    y varchar(5),
    unique key(x)
    );

    # 联合唯一

    create table service(
    ip varchar(15),
    port int,
    unique key(ip,port)
    );
    insert into service values
    ('1.1.1.1',3306),
    ('1.1.1.1',3306);




    四、primary key

    站在约束角度看primary key=not null unique
    以后但凡建表,必须注意:
    1、必须有且只有一个主键
    2、通常是id字段被设置为主键

    create table t5(
    id int primary key auto_increment
    );

    #补充存储引擎:

    数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
    create table t12(x int)engine='myisam';
    create table t13(x int)engine='innodb';
    create table t14(x int)engine='memory';
    create table t15(x int)engine='blackhole';

    create table t6(
    id int primary key auto_increment,
    name varchar(16),
    age int,
    sex varchar(6)
    )engine=innodb;


    #联合主键
    create table t19(
    ip char(15),
    port int,
    primary key(ip,port)
    );

    # primary key auto_increment
    create table t20(
    id int primary key auto_increment,
    name char(16)
    )engine=innodb;


    # auto_increment注意点:
    1、通常与primary key连用,而且通常是给id字段加
    2、auto_increment只能给被定义成key(unique key,primary key)的字段加



    五、foreign key

    限制关联表某一个字段的值必是来自于被关联表的一个字段的
    # foreign key注意:
    # 1、被关联的字段必须是一个key,通常是id字段
    # 2、创建表时:必须先建立被关联的表,才能建立关联表

    create table dep(
    id int primary key auto_increment,
    dname varchar(20),
    info varchar(50)
    );

    create table emp(
    id int primary key auto_increment,
    name varchar(15),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade
    on delete cascade
    );

    # 3、插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
    insert into dep(dname,info) values
    ('IT','技术能力有限部门xxx'),
    ('Sale','文化程度不高'),
    ('HR','招不到人部门');

    insert into emp(name,age,dep_id) values
    ('eron',18,1),
    ('alex',28,2),
    ('wsj',38,2),
    ('lxx',30,1),
    ('xiaohou',18,3);

    ps:删除时:应该先删除关联表emp中的记录,再删除被关联表对应的记录


    # 找两张表的关系的窍门
    emp dep
    #1、先站在左表的角度:去找左表emp的多条记录能否对应右表dep的一条记录
    翻译:多个员工能否属于一个部门

    #2、然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
    翻译:多个部门能否拥有同一名员工

    # 多对一:结果的判断
    #1、如果只有单向的多对一成立,那么最终的关系就是多对一
    #2、在emp表新增一个字段dep_id, 该字段外键关联dep(id)

    # 多对多:结果的判断
    #1、双向的多对一就是多对多
    #2、需要建立第三张表,有一个字段值fk左表,一个字段的值fk右表
    create table author(
    id int primary key auto_increment,
    name varchar(16),
    age int
    );

    create table book(
    id int primary key auto_increment,
    bname varchar(20),
    price int
    );

    insert into author values
    ('akon',18),
    ('alex',28),
    ('xxx',38);

    insert into book values
    ('葵花宝典',5),
    ('九阴真经',6),
    ('玉女剑法',7),
    ('如来神掌',10);


    create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) on update cascade on delete cascade,
    foreign key(book_id) references book(id) on update cascade on delete cascade
    );

    insert into author2book(author_id,book_id) values
    (1,3),
    (1,4),
    (2,2),
    (2,4),
    (3,1),
    (3,2),
    (3,3),
    (3,4);

    # 一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录
    fk+unique


    create table customer(
    id int primary key auto_increment,
    name varchar(20) not null,
    qq varchar(10) not null,
    phone varchar(16) not null
    );

    create table student(
    id int primary key auto_increment,
    class_name char(20) not null,
    customer_id int unique, #该字段一定要是唯一的
    foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
    on delete cascade
    on update cascade
    );

    insert into customer(name,qq,phone) values
    ('李飞机','31811231',13811341220),
    ('王大炮','123123123',15213146809),
    ('守榴弹','283818181',1867141331),
    ('吴坦克','283818181',1851143312),
    ('赢火箭','888818181',1861243314),
    ('战地雷','112312312',18811431230)


    insert into student(class_name,customer_id) values
    ('一班',1),
    ('二班',3),
    ('三班',5);



    delete from tb1;
    强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
    所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录

    delete from tb1 where id > 10;

    如果要清空表,使用truncate tb1;
    作用:将整张表重置



  • 相关阅读:
    ES6基础之——Set
    ES6基础之——继承extends
    ES6基础之——静态方法staitc
    ES6基础之——get 与 set
    ES6基础之——Class类
    ES6基础之——生成器Generators
    ES6基础之——迭代器Iterators
    ES6基础之——指向当前对象的原型对象 super
    ES6基础之——__proto__
    Vue慕课网音乐项目随手记--node代理及数据抓取
  • 原文地址:https://www.cnblogs.com/kingyanan/p/9460091.html
Copyright © 2011-2022 走看看