MySQL约束:非空约束、主键约束、唯一约束、默认约束、外键约束

来源:互联网 发布:印度人在中国 知乎 编辑:程序博客网 时间:2024/05/11 14:38
保证记录的唯一性
约束分为表级约束和列级约束
约束类型按功能包括有:非空约束、主键约束、唯一约束、默认约束、外键约束、

【自动编号】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定义。
0 0