数据库 表 的详细操作

1.存储引擎,mysql根据不同的表类型会有不同的处理机制。

2.表介绍
表相当于文件,表中的一条记录相当于文件的一行内容,表的一条记录有相应的标题,称为表的字段。

3.创建表
create table tablename(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
);

注意事项:
    在同一张表中,字段 名不能相同
    宽度和约束条件可选,非必须,
    字段名和类型为必须
    
4.查看表结构
    desc t1;(describe t1;) 查看表结构
    show create table t1\G; 加上\G查看详细结构。
    
5 基础数据类型
主要包含四种类型:数字,字符串,时间,枚举

    数字
    tinyint,  int, bigint
    tinyint
        有符号: -128 ~ 127
        无符号: 0 ~255
        mysql中无布尔值,使用tinyint(1)进行构造
        
    int:
        有符号: -2147483648 ~ 2147483647
        无符号: 0 ~ 4294967295
    bigint:
        有符号: -9223372036854775808 ~ 9223372036854775807
        无符号: 0 ~ 18446744073709551615
    设置有无符号:默认有符号 create table t1(x int);, create table t2(x int unsigned);
    
    
    
    int存储宽度是4bytes,即32bit.
    
    浮点型:
    定点数 类型,DEC等同DECIMAL
    浮点类型,FLOAT, DOUBLE
        FLOAT[(m,d),单精度浮点数,m是整数部分+小数部分总个数,最大值为255,d最大值为30,随着小数增多,越不准确。
        
        DOUBLE[(m,d)],双精度浮点数,m是整数部分+小数部分总个数,最大255,d最大值为30,精度比float高,但也会不准确。
        
        DECIMAL [(m,[,d]],准确的小数值,m是整数 部分+小数部分的总个数,d是小数点后个数,m最大65,d最大为30。精度始终准确
        
    位类型:
    BIT(M)可以用来存放多位进制数,m范围从1~64,如果不写默认为1位。
    对于位字段需要用函数读取,bin()显示为二进制,hex()显示为十六进制
    
    日期类型:
    日期类型包括:DATE, TIME,DATETIME, TIMESTAMP, YEAR
    year: yyyy(范围: 1901/2155)
    date: yyyy-mm-dd(范围: 1000-01-01/9999-12-31)
    time HH:MM:SS(范围: ‘-838:59:59’/‘838:59:59’)
    datetime: YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59)
    timestamp: YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037)
    
    datetime与timestamp区别;
        datetime的日期范围是1001-9999,timestamp是1970-2038
        datetime存储时间与时区无关,timestamp存储时间与时区相关,显示值也依赖时区。
        datetime使用8字节存储空间,timestamp存储空间为4字节,timestamp空间利用效率更高
        datetime默认值为null,timestamp字段默认不为空,为当前时间current_timestamp,如果不做特殊处理,并且update语句没有指定该列的更新值,则默认更新为当前时间。
    工作中一般用datetime就行
    
    字符串类型
    
    char类型, 定长,存取快速,但浪费空间
    范围 0-255(一个中文是一个字符,是utf8编码的3字节),存储char类型时,会往右填充空格满足长度。
    
    varchar 变长,精准,存储数度 慢,但节省空间。
    字符长度范围0-65535,varchar类型存储数据的真实内容,不会用空格填充。如果字符里包含空格,空格也会被保存。varchar类型会在真实数据前加1-2bytes前缀,用来表示 真实数据 的bytes字节数。
        真实数据<255bytes 1byttes前缀 2**8 255
        真实数据>255bytes 2bytes前缀 2**16 65535
        
    其他字符串类型:binary, varbinary, blob, text
    
    
    枚举类型与集合类型
    字段的值 只能在给定的范围内选反,如enum 单选,set多选
    
    如:size enum('x-small','small','medium','large','x-alrge')
        col set('a','b','c','d')
        
    6.表的完整约束性
    线束条件与数据类型的宽度一样,是可选参数,用于保证数据的完整性,一致性
    
    主要有:
        primary key (pk) 标识该字段为该表的主键,可以唯一的标识记录
        foreign key (fk) 标识该字段为该表的外键
        not null 标签该字段不能为空
        unique key(uk) 标示字段的值是唯一的
        auto_increment 标识该字段的值自动增长(整数类型,且为主键)
        default 为该字段设置默认值 
        unsigned 无符号
        zerofill 使用0填充
        
    Not null 与default, 是否可空,null表示空,非字符串
    not null - 不可空, null 可空
    默认值,创建列时可以指定默认值,如未主动设置,则自动添加默认值 
    create table t1( id int not null default 2, num int not null);
    注意:
        如果非严格模式,int类型不传值的话会默认为0,因为Null不是int 类型,所以自动将null变成0存储
    
    unique
    独一无二,唯一属性,
    
    primary key
    主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中有且只有一个主键
    如果创建表时没有指定主键,not null, unique会被 默认当作主键
    
    auto_increment
    约束字段为自动增长,被约束的字段必须同时被key约束,也就是说只能给约束成key的字段加自增属性,默认起始位置为1,步长也为1。
    
    创建表后修改字段起始值,
    create table student(id int primary key auto_increment, name varchar(20);
    alter table student auto_increment=3
    或者创建表时就指定,但应写在括号外:
    create tabel student(id int primary key auto_increment, name varchar(20) ) auto_increment=3;
    步长:
    mysql 自增的步长:
    基于会话级别: set session auth_increment_increment=2 # 修改会话级别的步长
    基于全局级别:set global auth_increment_increment=2 # 修改全局级别的步长
    注意:
        当auto_increment_offset > auto_increment_increment 时,auto_incremant_offset将忽略
    
    foreign key
    外键表明表与表之间的关系
    主要作用:
        先建立被关联的表的才能建立关联表
        在插入数据记录的时候,要向被关联表中插入数据,才能往关联表里插入数据
        更新或者删除数据的时候,需要考虑关联表和被关联表的关系:a删除表的时候,先删除关联表,再删除被关联表。b重建表的时候,在加外键的时候加上on_delete cascade on update cascade
        
    -表关系的总结 :
    找表关系的步骤:
        1.先站在左表角度去找
        如果左表的多条记录可以对应右表的一条记录,则表明左表的一个字段foreign key右表一个字段
        
        2.再站在右表的角度去找
        如果打开个的多条记录对应左表的一条记录,则右表一个字段foreign key左表一个字段
        
        如果1成立,则左表多对一右表
        如果2成立,则右表多对一左表
        如果 两者同时成立,则是多对多
        如果 都不成立,而是一条记录对应一条记录,则一对一
        
        class Book(models.Model):
            # 书籍
            name = models.CharField(verbose_name='书名', max_length=20, )
            price = models.DecimalField(verbose_name='价格', max_digits=5, decimal_places=2)
            publish_date = models.DateField(verbose_name='出版日期', default=timezone.now)
            press = models.ForeignKey(to='Press', related_name='press_book')
            author = models.ManyToManyField(to='Author', related_name='author_book')
        
        class Press(models.Model):
            # 出版社
            name = models.CharField(verbose_name='社名', max_length=32)
            city = models.CharField(verbose_name='所在城市', max_length=32)
        
        class Author(models.Model):
            # 作者
            name = models.CharField(verbose_name='姓名', max_length=32)
            age = models.IntegerField(verbose_name='年龄')
            author_detail = models.OneToOneField(to="AuthorDetail")
        
        # 站在book表看,book中多本书可以由一个出版社,book表有foreign key press
        # 站在book表看,book中一本书可以有多个作者,一个作者也可以有多本书,ManyToMany
         # 站在author表看,author中一条记录有一条authordetail记录,一对一
        
        约束外键的三种模式:
        district 严格约束,默认的,父表不能删除或者更新已经被子表引用的记录
        cascade 级联 模式,父表的操作,对应子表的关联数据也跟着操作
        set null 置空模式,父表操作之后 ,子表对应的数据被置空
        
        合理的约束模式:
            删除的时候子表置空,更新的时候子表级联。
            foreign key references 父表(主键字段) ondelete 模式 on update 模式;
            
    7 修改表alter table
        修改表名:alter table tablename rename new_table_name;
        增加字段:alter table 表名 add 字段名 数据类型[完整性约束条件], add 字段名 数据类型[完整性约束条件];
                add 字段名 数据类型[完整性约束条件],  First;增加字段时把它放到第一个字段的位置
                add 字段名 数据类型[完整性约束条件],  after 字段名,放到指定字段名后
        删除字段;alter table 表名 drop 字段名;
        修改字段:alter talbe 表名 modify 字段名 数据类型[完整性约束];
                alter table 表名 change 旧字段 名 新字段名 旧数据 [完整性约束条件]; #只改了字段名
                alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件]; 改了字段名及数据类型,约束条件等
                
    8.复制表
     语法: 复制表结构 + 记录 (key不会复制:主键,外键和索引)
    create table new_service select * from service; # 这句话的意思是你从service表里面查询出来的数据不要在屏幕上打印了,你直接给我的新表new_service
    
    只复制表结构,不要数据
    select * from service where 1=2;//条件为假,查不到任何记录,所以我们可以通过它来只复制表结构
    create table new_service select * from service where 1=2; 条件为假,只拿到了结构,所以只复制表结构
    
    

上一篇:mysql 语句

下一篇:数据库 行 的详细操作