常见类型

整型:

Tinyint 1Byte
Smallint 2B
Mediumint 3B
Int、integer 4B
Bigint 8B

* 加上unsigned会表示无符号
* 超过会报out of range value,但是会插入边界值
不设置长度,那会有默认的长度,表示显示宽度,加上ZEROFILL约束后,自动变成unsigned,显示时不够长用0补充

小数:

浮点型
    float(M,D) 4B
    double(M,D) 8B
定点型,下面两者是一样的
    DEC(M,D) M+2
    DECIMAL(M,D) M+2

* D表示小数点位数,M表示小数+整数一共多少位,但是都可以省略不写,DECIMAL(10,0)默认,float和double会根据精度决定
* 精度要求高的用DEC

字符型:

较短
    char(M)    0~255 比varchara效率高
    varchar(M) 0~65535 会根据实际给内存
    binary 类似上面的,保存二进制
    varbinary
较长
    text
    blob(较长的二进制数据)
ENUM  v的值只能是a或者b,不然为空
    CREATE TABLE T (
        v ENUM('a','b')
    );
SET   v的值由set内容组成,不分大小写,多个用逗号分开a,B
    CREATE TABLE T (
        v SET('a','b','c')
    );

* M表示字符数,中文也只算个,char可以省略,为1,varchar不可以

日期型:

data 4 只有日期 
datatime 8 有日期和时间
timestamp 4 时刻 受时区影响
time 3 只有时间
year 1 只有年

Blob类型:

常见约束

一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

CREATE TABLE 表名(
    字段名 字段类型 约束
)

NOT NULL 非空,用于保证该字段的值不能为空
DEFAULT 默认,用于保证该字段有默认值
UNIQUE 唯一,值具有唯一性,可以为空
CHECK 检查约束【mysql中不支持,但是不报错】
PRIMARY KEY 主键,值具有唯一性且非空
FOREIGN KEY 外键,用于限制两个表的关系,保证该字段的值必须来自于主表的关联列的值。就是该值能在别的表中找到。在从表添加外键约束,用于引用主表中某列的值。(数据在主表中,从表只有个编号)
如 员工表的部门编号,学生表的专业编号

主键和唯一:
    都有唯一性
    唯一只可以有一个null,主键不可以有;一个表只能有一个主键
    **可使用多个值共同作为主键**,唯一也可以由多个值组成

外键
    在从表中设置外键关系
    从表的外键列的类型和主表的关联列类型一致或兼容
    主表的关联列必须唯一性(主键或者唯一)
    插入数据时,先插入主表,再插入从表,删除则相反

约束的类型:

CREATE TABLE 表名(
        名 类型 列级约束,
        表级约束
)

列级约束
    六大约束语法上都支持,但外键约束没有效果

    CREATE TABLE 表名(
        id int primary key,
        stuname varchar(20) not null,
        gender char(1) check(gender='b' or gender='g'),
        seat int unique,
        age int default 18,
        majorid int references major(id)  //无效
    )

    CREATE TABLE major(
        id int primary key,
        majorname varchar(20)
    )

表级约束
    除了非空、默认,其它都支持
    [CONSTRAINT name] 这是可选的

    CREATE TABLE 表名(
        id int,
        stuname varchar(20),
        gender char(1) ,
        seat int,
        age int,
        majorid int,

        CONSTRAINT pk primary key(id),
        CONSTRAINT uq unique(seat),
        CONSTRAINT ck CHECK(gender='b' or gender='g'),
        CONSTRAINT fk_表名_major foreign key(majorid) references major(id)
    )

添加约束的时机:

创建表时

修改表时
    ALTER TABLE T MODIFY COLUMN 字段名 字段类型 新约束
    只要支持列级约束
    ALTER TABLE T ADD COLUMN [constraint 约束名] 约束
    只要支持表级约束

    ALTER TABLE T DROP PRIMARY KEY
    ALTER TABLE T DROP INDEX 唯一键名
    ALTER TABLE T DROP FOREIGN KEY 外键名

标识列

又称自增长列,可以不用手动的插入值,系统提供默认的序列值

创建表时
    CREATE TABLE T(
        id int primary key auto_increment,
        name varchar(20)
    )
    插入时,id这一位传入null就行,或者直接省略

    必须配合唯一性的键使用
    一个表只能有一个标识列,一个auto_increment关键字
    标识列只能是数字型 
    auto_increment_increment 步行 这是系统的值 用SET ...=n 修改
    auto_increment_offset 起始
    也可以插入一行,修改offset当前值

修改表时
    ALTER TABLE T MODIFY COLUMN 字段名 字段类型 约束 auto_increment;