unsigned

  1. 表示无符号
  2. 没有负数,从0开始
  1. -- 测试无符号,范围是0~256
  2. CREATE TABLE test_unsigned(
  3. a tinyint,
  4. b tinyint unsigned
  5. );
  6. -- 正常插入
  7. INSERT test_unsigned(a,b) VALUES(0,0);
  8. INSERT test_unsigned(a,b) VALUES(-12,0);
  9. -- 插入报错
  10. INSERT test_unsigned(a,b) VALUES(-12,-12); -- 报错
  11. INSERT test_unsigned(a,b) VALUES(0,256); -- 报错

zerofill

  1. 表示零填充
  2. 当显示长度不够显示长度的时候,可以使用前补0的效果填充至指定长度
  3. 不能是负数
-- 测试零填充
CREATE TABLE test_int1(
  a tinyint ZEROFILL,
  b smallint ZEROFILL,
  c mediumint ZEROFILL,
  d int ZEROFILL,
  e bigint ZEROFILL
);

INSERT test_int1(a,b,c,d,e) VALUES(1,1,1,1,1);
-- 结果为:|  001 | 00001 | 00000001 | 0000000001 | 00000000000000000001 |

所谓显示长度,是指tinyint(3)的 “3”

mysql> desc test_int1;
+-------+--------------------------------+------+-----+---------+-------+
| Field | Type                           | Null | Key | Default | Extra |
+-------+--------------------------------+------+-----+---------+-------+
| a     | tinyint(3) unsigned zerofill   | YES  |     | NULL    |       |
| b     | smallint(5) unsigned zerofill  | YES  |     | NULL    |       |
| c     | mediumint(8) unsigned zerofill | YES  |     | NULL    |       |
| d     | int(10) unsigned zerofill      | YES  |     | NULL    |       |
| e     | bigint(20) unsigned zerofill   | YES  |     | NULL    |       |
+-------+--------------------------------+------+-----+---------+-------+

我们可以在创建表的时候,就指定显示长度,不过一般配合zerofill使用

CREATE TABLE test_int1(
  a tinyint(2) ,
  b smallint(2)
);

NOT NULL

  1. 表示非空
  2. 插入值的时候必须给字段赋值
--测试NOT NULL(非空)
CREATE TABLE test_not_null(
  a varchar(20),
  b varchar(20) not null
);

INSERT test_not_null(a,b) VALUES('','');            -- |      |      |
INSERT test_not_null(a,b) VALUES(NULL,NULL);    -- 报错
INSERT test_not_null(a,b) VALUES(NULL,'abc');    -- | NULL | abc  |
INSERT test_not_null(a) VALUES('test');                -- 报错
INSERT test_not_null(b) VALUES('test');                -- | NULL | test |

DEFAULT

  1. 表示默认值
  2. 如果插入记录的时候没有给字段赋值,就使用默认值
--测试DEFAULT(默认值)
CREATE TABLE test_default(
  id INT UNSIGNED AUTO_INCREMENT KEY,
  username VARCHAR(20) NOT NULL,
  age TINYINT UNSIGNED DEFAULT 18,
  email VARCHAR(50) NOT NULL DEFAULT '576813175@qq.com'
);

INSERT test_default(username) VALUES('A');
-- |  1 | A        |   18 | 576813175@qq.com |

INSERT test_default(username,age,email) VALUES('B',30,'imooc@qq.com');
-- |  2 | B        |   30 | imooc@qq.com     |

INSERT test_default(username,age,email) VALUES('C',NULL,'imooc@qq.com');
-- |  3 | C        | NULL | imooc@qq.com     |

INSERT test_default(username,age,email) VALUES('C',NULL,NULL);
-- 报错

INSERT test_default(username,age,email) VALUES('C',NULL,DEFAULT);
-- |  4 | C        | NULL | 576813175@qq.com |

PRIMARY KEY

  1. 表示主键
  2. 标识记录的唯一性,值不能重复
  3. 自动禁止为空
  4. PRIMARY 可以省略
  5. 一个表只能有一个主键
  6. 可以指定复合主键,当复合主键的值都相同的时候,才会报主键重复错误
--测试主键
CREATE TABLE test_primary_key(
  id INT UNSIGNED PRIMARY KEY,
  username VARCHAR(20)
);

INSERT test_primary_key(id,username) VALUES(1,'song');    -- 正确
INSERT test_primary_key(username) VALUES('song');                -- 报错,主键不能为空
INSERT test_primary_key(id,username) VALUES(1,'hui');        -- 报错,主键重复

-- PRIMARY 可以省略
CREATE TABLE test_primary_key1(
  id INT UNSIGNED KEY,
  username VARCHAR(20)
);
-- 指定主键的另外方式
CREATE TABLE test_primary_key2(
  id INT UNSIGNED,
  username VARCHAR(20),
  PRIMARY KEY(id)
);

--以下会报错,不允许存在两个主键
CREATE TABLE test_primary_key3(
  id INT UNSIGNED PRIMARY KEY,
  courseId INT UNSIGNED PRIMARY KEY,
  username VARCHAR(20)
);

--复合主键,以下这样是可以的
--当id和courseId同时相同的时候,才会报主键重复错误
CREATE TABLE test_primary_key3(
  id INT UNSIGNED,
  courseId INT UNSIGNED,
  username VARCHAR(20),
  PRIMARY KEY(id,courseId)
);

INSERT test_primary_key3(id,courseId,username) VALUES(1,1,'song');    -- |  1 |  1 | song |
INSERT test_primary_key3(id,courseId,username) VALUES(1,2,'song');    -- |  1 |  2 | song |
INSERT test_primary_key3(id,courseId,username) VALUES(2,1,'nian');    -- |  2 |  1 | nian |
INSERT test_primary_key3(id,courseId,username) VALUES(1,1,'song');    --会报错

UNIQUE NKEY

  1. 表示唯一性
  2. 同样的值不能重复,但是NULL值除外
  3. 一个表中可以有多个字段是唯一索引
  4. NULL不算重复
CREATE TABLE test_unique(
  id INT UNSIGNED AUTO_INCREMENT KEY,
  username VARCHAR(20) NOT NULL UNIQUE KEY,
  email VARCHAR(50) UNIQUE,
  card CHAR(18) UNIQUE
);

INSERT test_unique(username,email,card) VALUES('A','A@qq.com','1');
-- |  1 | A        | A@qq.com | 1    |

INSERT test_unique(username,email,card) VALUES('A','B@qq.com','2');
-- 会报错

INSERT test_unique(username,email,card) VALUES('B',NULL,NULL);
-- |  2 | B        | NULL     | NULL |

INSERT test_unique(username,email,card) VALUES('C',NULL,NULL);
-- |  3 | C        | NULL     | NULL |

AUTO_INCREMENT

  1. 表示自动增长
  2. 只能用于数值列,而且配合索引使用
--测试AUTO_INCREMENT
--从已有编号的最大值开始自增
CREATE TABLE test_auto_increment(
  id INT UNSIGNED KEY AUTO_INCREMENT,
  username VARCHAR(20)
);

INSERT test_auto_increment(username) VALUES('A');        -- |  1 | A        |
INSERT test_auto_increment(username) VALUES('B');        -- |  2 | B        |
INSERT test_auto_increment(username) VALUES('C');        -- |  3 | C        |

INSERT test_auto_increment(id,username) VALUES(5,'C');                -- |  5 | C        |
INSERT test_auto_increment(username) VALUES('D');                            -- |  6 | D        |
INSERT test_auto_increment(id,username) VALUES(NULL,'E');            -- |  7 | E        |
INSERT test_auto_increment(id,username) VALUES(DEFAULT,'F');    -- |  8 | F        |
INSERT test_auto_increment(id,username) VALUES('','F');                -- 报错