保证记录的唯一性
约束分为表级约束和列级约束
约束类型按功能包括有:非空约束、主键约束、唯一约束、默认约束、外键约束、
【自动编号】AUTO_INCREMENT
起始值为1,增量为1。
自动编号的字段必须为数值型,若为浮点数小数位数必须为0。
自动编号必须和主键组合使用,而主键不一定和AUTO_INCREMENT一起使用。
【主键约束】PRIMARY KEY
每张数据表只能存在一个主键
主键保证记录的唯一性(主键的字段允许赋值但是不能为相同值)
主键约束字段自动为NOT NULL
例:
CREATE TABLE tb3(
->id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
->username VARCHAR(30) NOT NULL
->);
id是自动编号,主键PRI不为NULL,不需要赋值。
赋值username并且查看:
INSERT tb3(username) VALUES('Tom'); //id 1
INSERT tb3(username) VALUES('John'); // id 2
INSERT tb3(username) VALUES('Rose');// id 3
INSERT tb3(username) VALUES('Dimitar'); // id 4
SELECT * FROM tb3;
只有主键没有AUTO_INCREMENT:
CREATE TABLE tb4(
->id SMALLINT UNSIGNED PRIMARY KEY,
->username VARCHAR(30) NOT NULL
->);
INSERT tb4 VALUES(4, 'Tom');
INSERT tb4 VALUES(22, 'John');
INSERT tb4 VALUES(22, 'Rose'); // error
主键的字段可以赋值但是不能为相同值。
【唯一约束】UNIQUE KEY
每张数据表可以存在多个唯一约束
唯一约束可以保证记录的唯一性,不能出现重复字段
唯一约束的字段可以为空值NULL(空值唯一)
创建的索引与主键约束不同
例:
CREATE TABLE tb5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
->username VARCHAR(20) NOT NULL UNIQUE KEY,
->age TINYINT UNSIGNED);
SHOW COLUMNS FROM tb5;
INSERT tb5(username,age) VALUES('Tom', 22); //OK
INSERT tb5(username,age) VALUES('Tom', 22); //error username重复
SELECT * FROM tb5;
【默认约束】DEFAULT
当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
例:
CREATE TABLE tb6(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
->username VARCHAR(20) NOT NULL UNIQUE KEY,
->age TINYINT UNSIGNED,
->sex ENUM('1','2','3') DEFAULT '3');
SHOW COLUMNS FROM tb6;
INSERT tb6(username) VALUES('Tom');
SELECT * FROM tb6;
【外键约束】FOREIGN KEYp
保持数据一致性,完整性。
实现一对一或一对多关系。
创建外键约束的要求:
1、父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
2、数据表的存储引擎只能为InnoDB。
3、外键列和参照列必须具有相似的数据类型。其中数字的长度或是否又符号位必须相同,而字符的长度则可以不同。
4、外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引。
编辑数据表的默认存储引擎:
MySQL配置文件:default-storage-engine=INNODB
【父表】参照列
CREATE TABLE provinces(
->id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
->pname VARCHAR(20) NOT NULL
->);
SHOW CREATE TABLE provinces; //查看数据表的创建命令
【子表】外键列
CREATE TABLE users(
->id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
->username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED,
->FOREIGN KEY (pid) REFERENCES provinces(id)
->);
SHOW CREATE TABLE users; //查看到id的主键约束和pid的外键约束KEY
pid 外键列 与 id 参照列 具有相似的数据类型,在数字的情况下必须相同,字符情况下可以不同。
外键列和参照列必须创建索引。这里pid没有创建索引,MySQL自动创建。
【显示索引】
SHOW INDEXES FROM provinces;
SHOW INDEXES FROM provinces\G; // \G 网格形式
SHOW INDEXES FROM users\G;
【外键约束的参照操作】
CASCADE: 从父表删除或更新记录时,同时也删除或更新子表中匹配的行
SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL。使用该选项必须保证子表列表没有指定NOT NULL。
RESTRICT:拒绝父表的删除或更新操作。
NO ACTION: 标准SQL的关键字,在MySQL中与RESTRICT相同
例:
CREATE TABLE users1(
->id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
->username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED,
->FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE
->);
插入记录,必须先在父表中插入记录才能在子表插入。
INSERT provinces(pname) VALUES('A'); //id=1
INSERT provinces(pname) VALUES('B');//id=2
INSERT provinces(pname) VALUES('C');//id=3
INSERT users1(username,pid) VALUES('Tom', 3);//id=1, pid=3
INSERT users1(username,pid) VALUES('John', 7); // error 父表中没有id=7的数据,但是子表的id+1
INSERT users1(username,pid) VALUES('John', 1);//id=3,pid=1
INSERT users1(username,pid) VALUES('Rose', 3);//id = 4,pid=3
【CASCADE下的删除DELETE】
DELETE FROM provinces WHERE id=3; // 父表的id=3被删除,子表的pid=3被删除
实际开发中很少使用物理的外键约束,一般使用逻辑的外键约束。
物理的外键约束只有INNODB引擎才支持。
逻辑的外键:定义两张表的结构时,按照结构定义,不适用FOREIGN KEY定义。