数据表管理
定义数据栏位有几个约束情况。
主键约束
对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
- 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的, 大部分编程语言都内置了GUID算法,可以自己预算出主键。
使用关键字PRIMARY KEY,设定数据表的栏位为主键。下面的命令表示创建一个数据表tearcher,并设置其id栏位为主键。
mysql> CREATE TABLE teacher(id bigint PRIMARY KEY); Query OK, 0 rows affected (0.07 sec)
非空约束
使用关键字NOT NULL,设置数据表栏位不为空。
mysql> ALTER TABLE teacher ADD COLUMN name VARCHAR(20) NOT NULL; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0
上述命令修改teacher数据表,添加一个栏位name,不允许栏位信息为空。
DEFAULT约束
使用关键字DEFAULT,设置数据表栏位的默认值。
mysql> ALTER TABLE teacher ADD COLUMN age int NOT NULL DEFAULT 0; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0
上述命令修改teacher数据表,添加一个栏位age,其默认值是0。
检查约束
使用关键字CHECK,设置数据表栏位检查约束。
ALTER TABLE <表名> ADD CONSTRAINT <约束名> CHECK <条件表达式>;
mysql> ALTER TABLE teacher ADD CONSTRAINT agecheck CHECK (age>22 and age<100); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
上述命令修改teacher数据表,添加一个检查约束设置age在22岁到100岁之间。
使用SHOW CREATE TABLE命令查看添加的约束信息。
mysql> SHOW CREATE TABLE teacher\G; *************************** 1. row *************************** Table: teacher Create Table: CREATE TABLE `teacher` ( `id` bigint NOT NULL, `name` varchar(20) NOT NULL, `age` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), CONSTRAINT `agecheck` CHECK (((`age` > 22) and (`age` < 100))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
唯一约束
使用关键字UNIQUE KEY,设置数据表栏位的每一条记录都是唯一的。
mysql> ALTER TABLE teacher ADD COLUMN idCard VARCHAR(20) NOT NULL UNIQUE KEY; Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0
使用SHOW CREATE TABLE命令查看添加的idCard栏位及其唯一约束
mysql> SHOW CREATE TABLE teacher\G *************************** 1. row *************************** Table: teacher Create Table: CREATE TABLE `teacher` ( `id` bigint NOT NULL, `name` varchar(20) NOT NULL, `age` int NOT NULL DEFAULT '0', `idCard` varchar(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idCard` (`idCard`), CONSTRAINT `agecheck` CHECK (((`age` > 22) and (`age` < 100))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
外键约束
使用FOREIGN KEY关键字设置外键,REFERENCES 关键字参考表和栏位。
ALTER TABLE <表名> ADD CONSTRAINT <外键名称> FOREIGN KEY (<栏位>) REFERENCES <参考表>(<栏位>);
mysql> ALTER TABLE student ADD CONSTRAINT classFK FOREIGN KEY (classId) REFERENCES class(id); Query OK, 0 rows affected (0.13 sec)> Records: 0 Duplicates: 0 Warnings: 0
上述命令给student表添加一个外键classId,其参考表为class,参考栏位为id。