zoukankan      html  css  js  c++  java
  • Python 第四十一章 数据库的类型和约束

    数据库的类型

    https://www.cnblogs.com/clschao/articles/9959559.html
    创建表
    create table 表名
    create database day41; #创建表
    use day41; # 使用表

    
    ####数值类型
    ```python
    类型                  大小     范围有-号               范围无-号
    tinyint(小整数)      1个字节   (-128~127)              (0~255)
    int(整数)            4个字节   (很大的负数~很大的正数)    (0~很大的数)
    float(单精度)        4个字节   (255~30)
    double(双精度)       8个字节   (255~30)
    decimal(准确的小数)            依赖M和D的值              依赖M和D的值
    1.整数类型
    tinyint
    创建有-号
    <mysql> create table t1(id tinyint); # 创建有-号
    <mysql> insert into t1 values(11); # 可插入-128~127范围的数字
    <mysql> insert into t1 values(-200); # 超出范围报错
    ERROR 1264 (22003): Out of range value for column 'id' at row 1 # 报错不能插入
    <mysql> select * from t1;
    +-------+
    | monet |
    +-------+
    |    11 |
    +-------+
    
    创建无-号
    <mysql> create table t2(id tinyint unsigned); # 创建无-号
    <mysql> insert into t2 values(10); # 可插入0~255范围的数字
    <mysql> insert into t2 values(-10); # 超出范围报错
    ERROR 1264 (22003): Out of range value for column 'id' at row 1 # 报错不能插入
    <mysql> select * from t2;
    +------+
    | id   |
    +------+
    |   10 |
    +------+
    1 row in set (0.00 sec)
    # 创建表后面不能加,号
    
    
    int integer  4个字节
    
    float 单点型 (255,30) 255整数+小数位 30小数位
    <mysql> create table t3(id float(60,30)); # 60 整数位 30 小数位
    <mysql> insert into t3 values(1.111111111111111111);
    <mysql> select * from t3;
    +----------------------------------+
    | id                               |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    double  双精度 (255,30)
    <mysql> create table t4(id double(60,30));
    <mysql> insert into t4 values(1.111111111111111111);
    <mysql> select * from t4;
    +----------------------------------+
    | id                               |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    decimal 小数 存的字符串 很精准 (65,30)
    <mysql> create table t5(id decimal(60,30));
    <mysql> insert into t5 values(1.111111111111111111);
    <+----------------------------------+
    | id                               |
    +----------------------------------+
    | 1.111111111111111111000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)
    

    日期类型

    date time datetime imestamp year
    
    <mysql> create table t6(d1 year,d2 date,d3 datetime); # 设置三个时间类型
    <mysql> insert into t6 values(now(),now(),now()); # 设置当前时间
    Query OK, 1 row affected, 1 warning (0.01 sec) # 当前时间报错
    <mysql> select * from t6;
    +------+------------+---------------------+
    | d1   | d2         | d3                  |
    +------+------------+---------------------+
    | 2019 | 2019-08-30 | 2019-08-30 10:10:25 |
    +------+------------+---------------------+
    1 row in set (0.00 sec)
    

    ** sql 设置严格模式,一定要使用严格模式,避免出现线上问题

    会话:持续保持通信
    sql_mode 配置严格模式,遇到错误就报错
    mysql> select @@sql_mode;
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | @@sql_mode                                                                                                                                |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    
    全局会话:@@global.sql_mode
    <mysql> select @@global.sql_mode;
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | @@global.sql_mode                                                                                                                         |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    永久生效:
    Windows 直接打开配置文件,在最后一行添加
    设置严格模式
    sql_mode = 'STRICT_TRANS_TABLES'
    mac下修改成严格模式:
    编辑mysql的配置文件
    sudo vim /etc/my.cnf
    按i进入编辑模式 
    配置成严格模式
    sql_mode = 'STRICT_TRANS_TABLES'
    
    
    当前会话变成严格格式:
    set session sql_mode = 'STRICT_TRANS_TABLES';
    @@sql_mode 约束sql语句的模式
    只是开启的这个客户端与服务端通信时会走严格模式
    <mysql> set session sql_mode = 'STRICT_TRANS_TABLES';
    <mysql> select @@sql_mode;
    +---------------------+
    | @@sql_mode          |
    +---------------------+
    | STRICT_TRANS_TABLES |
    +---------------------+
    1 row in set (0.00 sec)
    
    
    设置全局会话变成严格模式:
    <mysql> set global sql_mode = 'STRICT_TRANS_TABLES';
    <mysql> select @@global.sql_mode;
    +---------------------+
    | @@global.sql_mode   |
    +---------------------+
    | STRICT_TRANS_TABLES |
    +---------------------+
    1 row in set (0.00 sec)
    
    #需关闭服务,再次开启链接,才会再次生效
    

    字符串类型

    char varchar 
    区别:存数据的时候在硬盘开的空间不一样
    char 定长的 开辟10个字符的空间长度 会浪费空间 建议小数据类型存储
    varchar 变长的 开辟空间长度是插入几个用几个 不一定省空间 建议大数据类型存储
    会多存一个长度的空间 当char的数据=varchar数据的时候 varchar更占空间 
    char
    <mysql> create table t7(name char(10));
    设置char类型的
    插入字符长度 char(10)
    <mysql> desc t7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | name  | char(10) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    显示宽度 (4)默认的,非设置的 最长4个 -128
    <mysql> desc t1;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | monet | tinyint(4) | YES  |     | NULL    |       |
    +-------+------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
    <mysql> insert into t7 values('1111111');
    <mysql> insert into t7 values('111111111111');
    ERROR 1406 (22001): Data too long for column 'name' at row 1
    
    
    varchar
    <mysql> create table t8(name varchar(10));
    设置varchar类型的
    

    枚举类型和集合类型

    枚举类型:
    enum
    插入单选
    CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                    );
    	INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
    
    
    集合类型:
    set
    插入多选
    
    集合类型(set)
    A SET column can have a maximum of 64 distinct members.
    示例:
    	CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    	INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    

    类的约束

    约束条件:
    数据不能一样,一样会报错
    
    约束不能为空:name char(5) not null
    <mysql> create table t11(id int,name char(5) not null);
    
    <mysql> insert into t11 values('xx');
    ERROR 1136 (21S01): Column count doesn't match value count at row 1 # 必须制定字段
    
    不制定字段需要都输入
    <mysql> insert into t11(name) values('xx');
    Query OK, 1 row affected (0.00 sec)
    <mysql> select * from t11;
    +------+------+
    | id   | name |
    +------+------+
    | NULL | xx   |
    +------+------+
    1 row in set (0.00 sec)
    
    <mysql> insert into t11(id) values(1);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value # name 不能为空,现在没有值
    
    <mysql> create table t12(id int,name char(10) default);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 # 没有设置默认值
    <mysql> create table t12(id int,name char(10) default 'xx'); # default 'xx'设置默认值
    Query OK, 0 rows affected (0.02 sec)
    <mysql> desc t12;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  |     | NULL    |       |
    | name  | char(10) | YES  |     | xx      |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    <mysql> create table t13(id int,name char(10) not null default 'xx');
    Query OK, 0 rows affected (0.03 sec)
    
    <mysql> insert into t13(id) values(1);
    Query OK, 1 row affected (0.00 sec)
    <mysql> select * from t13;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | xx   |
    +------+------+
    1 row in set (0.00 sec)
    
    unique 唯一数据不能重复
    <mysql> create table t14(id int,name char(10) unique);
    <mysql> insert into t14 values(1,'xxxx');
    ERROR 1062 (23000): Duplicate entry 'xxxx' for key 'name' # name的值有重复的
    
    primary key 主键不能为空唯一
    <mysql> create table t15(id int primary key,name char(10));
    <mysql> insert into t15(name) values('xxx');
    ERROR 1364 (HY000): Field 'id' doesn't have a default value # 必须有id键
    <mysql> insert into t15 values(1,'xxx');
    Query OK, 1 row affected (0.00 sec)
    
    <mysql> insert into t15 values(1,'xxxx');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' # id必须唯一
    
    auto_increment自增
    <mysql> create table t15(id int auto_increment,name char(10));
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key # 必须有主键
    
    <mysql> create table t16(id int primary key auto_increment,name char(10)); # 设置主键和自增
    <mysql> insert into t16(name) values('xxx');
    Query OK, 1 row affected (0.00 sec)
    <mysql> select * from t16;
    +----+------+
    | id | name |
    +----+------+
    |  1 | xxx  |
    +----+------+
    1 row in set (0.00 sec)
    <mysql> insert into t16(name) values('xxxx');
    Query OK, 1 row affected (0.00 sec)
    <mysql> select * from t16;
    +----+------+
    | id | name |
    +----+------+
    |  1 | xxx  |
    |  2 | xxxx |
    +----+------+
    2 rows in set (0.00 sec)
    # id 自动加1
    

    foreign key 外键 关联字段 建立表和表的关系

    强制约束效果,强制关联id等字段,类似指针,指向另一个表的id
    不能超出id的最大值
    一对一
    一对多
    多对多
    
    一对一
    先创建出版社表,否则报错
    <mysql> create table publish(id int primary key auto_increment,name char(10));
    在创建书表,关联字段建立连接 外键写法
    delete 
    强制约束效果删除错误 不能删除或者父级类的键
    一对一关系
    学生表(student)和客户表(customer)
    create table student(
    		id int primary key,
    		name char(10),
    		cid int unique,
    		foreign key(cid) references customer(id)
    		);
    
    一对多
    在多的表里面添加一个字段,并给这个字段加foreign key,比如:
    出版社对应书籍是多对一的关系
    1.先创建出版社表  publish表
    2.创建书籍表,外键写法:
    	create table book(
    		id int primary key,
    		name char(10),
    		pid int,
    		foreign key(pid) references publish(id)
    		);
    先给出版社插入数据 否则会报错
    
    
    多对多
    通过id对应两个表的id,这个表强制约束另外两个表
    先创建作者表
    再创建书籍表
    (都可以)
    最后第三张表来完整两者的约束作者和书籍表
    create table authortobook(
    		id int primary key,
    		author_id int,
    		book_id int,
    		foreign key(author_id) references author1(id),
    		foreign key(book_id) references book1(id)
    		);
    
    
  • 相关阅读:
    Mybatis入门
    Ajax
    产品经理之产品规划
    产品经理之用户研究(下)
    产品经理之用户研究(上)
    Spring Cloud
    Spring MVC
    synchronized
    Spring Boot入门
    Spring
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11444422.html
Copyright © 2011-2022 走看看